PHP:爆炸中的未定义偏移量()

时间:2011-07-13 23:07:02

标签: php offset

我有这个:

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

Sometiems $ lastname没有定义,而且我在那里得到未定义的偏移量错误。

因为找不到任何要放在$ lastname中的内容,我猜。

爆炸后()我有:

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

所以我的问题是,如果没有定义$ lastname,我怎么能把它定义为$ firstname(如果你只写'Adam'而不是'Adam Thompson',应该定义lastname,这样'Adam Adam')

它现在为我做了这个,但我收到了偏移错误

5 个答案:

答案 0 :(得分:31)

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

2中的explode()确保最多 2个值且array_pad()确保至少 2个值。如果没有空格字符,则$lastnamenull。这可以用来决定接下来会发生什么

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

小更新:对于这个特定情况,你可以使用一个小技巧

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

这将一步完成所有这些。它应该工作,因为

  • 始终至少有一个值($firstname
  • 如果有一个值,则为$queryString == $firstname。现在是用于填充数组最多2个值的值(正好是一个,因为我们已经有一个值)
  • 如果有两个值,则数组未填充$queryString,因为我们已经有两个值

至少为了便于阅读,我更喜欢第一个更明显的解决方案。

答案 1 :(得分:3)

尝试添加空格:

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

之后不应该改变一件事。

答案 2 :(得分:1)

您没有收到错误,而是通知

虽然这是可接受的,因为PHP是一种动态语言,您可以使用isset()来阻止它:

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

更新

根据评论,list()通知的罪魁祸首。在这种情况下,当list()没有产生适当数量的参数时,我不建议使用explode()

如果必须, brady undefined offset when using php explode() 的答案可以工作。虽然在我看来它很漂亮丑陋。我相信如果您只是执行以下操作,您的代码会更加直观:

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

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

答案 3 :(得分:1)

我今天刚遇到这个。我的解决方案不是上面的, (这没有效果)我的如下:

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

而不是:

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

答案 4 :(得分:0)

我不清楚为什么会这样,但通知会消失。首先,使用此代码,我得到未定义的偏移通知:

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

但是,使用此代码,我不会:

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

另请注意,在$ dateToChange附加' - '或' - '后,我会收到偏移通知。它需要三个破折号才能在我的例子中用四个变量消失。 $ junk包含两个破折号(一个是分隔符)。