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

PHP:explode()中未定义的偏移量,php,offset,Php,Offset,我有这个: list($firstname, $lastname) = explode(' ', $queryString); Sometiems$lastname没有定义,在那里我得到了未定义的偏移量错误 因为我想它找不到任何东西可以输入$lastname 在爆炸()之后,我有: 因此,我的问题是,如果未定义$lastname,我如何将其定义为$firstname(如果您只编写了'Adam'而不是'Adam Thompson',则应将lastname定义为'Adam Adam') 它现在为我

我有这个:

list($firstname, $lastname) = explode(' ', $queryString);
Sometiems$lastname没有定义,在那里我得到了未定义的偏移量错误

因为我想它找不到任何东西可以输入$lastname

在爆炸()之后,我有:

因此,我的问题是,如果未定义$lastname,我如何将其定义为$firstname(如果您只编写了'Adam'而不是'Adam Thompson',则应将lastname定义为'Adam Adam')

它现在为我这样做了,但我收到了偏移错误,您没有收到错误,而是收到了通知

尽管这是可以接受的,因为PHP是一种动态语言,但您可以通过以下方式防止它:

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

如果必须的话,brady给出的答案或可以起作用。虽然在我看来这很难看。我相信,如果您只执行以下操作,您的代码将更加直观:

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

if (isset($name[1])) {
  // show lastname
}
else {
  // show firstname
}
while (!feof($fh))
{
    $line = fgets($fh);
    print $line;
}
尝试附加一个空格:

list($firstname, $lastname) = explode(' ', $queryString . ' ' );
在那之后不应该再做任何改变

list($firstname, $lastname) = array_pad(explode(' ', $queryString, 2), 2, null);
explode()
中的
2
确保最多有2个值,
array\u pad()
确保至少有2个值。如果没有空格字符
$lastname
null
。你可以用它来决定接下来会发生什么

$lastname = is_null($lastname) ? $firstname : $lastname;
小更新:对于这种特殊情况,您可以使用一个小技巧

list($firstname, $lastname) = array_pad(explode(' ', $queryString, 2), 2, $queryString);
这将一步完成所有这些。它应该有用,因为

  • 始终至少有一个值(对于
    $firstname
  • 如果有一个值,则
    $queryString==$firstname
    。这就是现在用来填充数组的值,最多2个值(正好是一个,因为我们已经有了一个值)
  • 如果有两个值,那么数组中不会填充
    $queryString
    ,因为我们已经有了两个值

至少在可读性方面,我更喜欢第一个更明显的解决方案。

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

list($month, $day, $year)=explode('-', $dateToChange, 3);
但是,使用此代码,我不会:

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

另外请注意,在$dateToChange后面加上“-”或“--”,我将得到抵销通知。在我的示例中,它需要三个破折号才能消失,并且有四个变量$垃圾包含两个破折号(一个是分隔符)。

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

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

if (isset($name[1])) {
  // show lastname
}
else {
  // show firstname
}
while (!feof($fh))
{
    $line = fgets($fh);
    print $line;
}
而不是做:

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

通知出现在explode()处,因此即使我将if包装在isset()中,它也会出现still@JasonMcCreary
isset
不会阻止该通知,因为它会被抛出到
列表中
assignment@brian_d你说得对。我不鼓励在这种情况下使用
list()
。+1有趣的解决方案。虽然我认为这样一件简单的事情太过分了。我不能理解。。。第一个解决方案只添加一个函数调用。这是一个单一的函数调用,而不是“过度杀戮”。附加的
array\u pad()
是一个函数,它确实(并且是专为)这个用例设计的:确保至少有
x
元素。通过说“它的杀伤力太大了”,你也会说,
array\u pad()
是完全无用的。请慢一点。这有点牵强-过度杀戮=
array\u pad()
没有用。我没有说过这样的话。正如我指出的,这是一个有趣的解决方案。但是,我维护了3个函数调用,而1个函数调用可能会造成过度杀伤力。此外,我认为在名为
$lastname
的变量中存储firstname是不直观的,并且会导致糟糕的代码。我宁愿鼓励OP做得更好,也不愿让它工作。@JasonMcCreary我有两个函数调用(请注意,
list()
是一个语言构造),它们都是本机C函数,您有一个函数调用,但如果
-构造,则还有一个
。如果你能可靠地测量出一个显著的差异,我可能会同意,这是一个过度杀伤力。有人能告诉我,为什么我有两台服务器-一台是PHP5.2.6,另一台是5.3.3,-我只在5.3.3中得到错误
未定义的偏移量
,虽然在5.2.6中,相同数据上的相同代码可以顺利运行,但最好不要简单地提供破解,答案背后的推理也是最好的。