PHP: undefined offset in explode()

2019-01-27 17:38发布

问题:

I have this:

list($firstname, $lastname) = explode(' ', $queryString);

Sometiems $lastname does not gets defined, and it's there i am getting undefined offset error.

Because it can not find anything to put in $lastname, i guess.

After the explode() i have:

if(!$lastname) { $lastname = $firstname; }

So my question is how can i define it as the $firstname if $lastname is not defined (if you wrote only 'Adam' and not 'Adam Thompson', the lastname should be defined so it is 'Adam Adam')

It does this for me now, but I am receiving the offset error

回答1:

list($firstname, $lastname) = array_pad(explode(' ', $queryString, 2), 2, null);

The 2 in explode() ensures, that there are at most 2 values and array_pad() ensures, that there are at least 2 values. If there is no space character , $lastname is null. This you can use to decide what comes next

$lastname = is_null($lastname) ? $firstname : $lastname;

Little update: For this specific case you can use a little trick

list($firstname, $lastname) = array_pad(explode(' ', $queryString, 2), 2, $queryString);

This will do all that in one step. It should work, because

  • There is always at least one value (for $firstname)
  • If there is one value, then $queryString == $firstname. Thats now the value that is used to fill the array up to 2 values (which is exactly one, because one value we already have)
  • If there are two values, then the array is not filled with $queryString, because we already have 2 values

At least for readability I would prefer the first more obvious solution.



回答2:

Try appending a space:

list($firstname, $lastname) = explode(' ', $queryString . ' ' );

shouldn't have to change a thing after that.



回答3:

You're not getting an Error, but a Notice.

Although this is acceptable since PHP is a dynamic language, you can prevent it with isset():

if(!isset($lastname)) {
  $lastname = $firstname;
}

UPDATE

Per the comments, list() is the culprit for the Notice. In which case, I wouldn't recommend the use of list() when explode() doesn't yield the appropriate number of parameters.

If you must, the answer by brady or undefined offset when using php explode() can work. Although it's pretty ugly in my opinion. I believe your code would be much more intuitive if you just did the following:

$name = explode(' ', $queryString);

if (isset($name[1])) {
  // show lastname
}
else {
  // show firstname
}


回答4:

I just ran into this today. my solution was not the above, (which had no effect) mine was the following:

while (!feof($fh))
{
    $line = fgets($fh);
    print $line;
}

instead of doing:

while ($line = fgets($fh))
{
     print $line;
}


回答5:

I'm not clear why this works, but the notice will go away. First, with this code I get the undefined offset notice:

list($month, $day, $year)=explode('-', $dateToChange, 3);

However, with this code, I don't:

list($month, $day, $year, $junk)=explode('-', $dateToChange.'---', 4);

Also note, with '-' or '--' appended to $dateToChange, I will get the offset notice. It takes three dashes for it to go away in my example with four variables. $junk contains the two dashes (one being a separator).



标签: php offset