使用PHP的explode()函数时出现undefined offset错误

21

我写了一个看起来很简单的PHP代码,使用explode()函数将名称分成名字和姓氏:

// split name into first and last
$split = explode(' ', $fullname, 2);
$first = $split[0];
$last = $split[1];

然而,这会抛出一个 PHP 错误,错误信息为"Undefined offset: 1"。虽然函数似乎仍在工作,但我想澄清导致该错误的原因。我已经检查了PHP 手册,但他们的示例使用与上述相同的语法。我认为我理解什么是未定义的偏移量,但我看不到我的代码为什么会生成错误!


9
дҪ иғҪжҸҗдҫӣеҜјиҮҙй”ҷиҜҜзҡ„$fullnameеҸҳйҮҸзҡ„еҖјеҗ—пјҹ - Emil Ivanov
7个回答

50

这是因为你的全名中没有空格。你可以使用一个简单的技巧来确保空格总是在

 $split = explode(' ', "$fullname ");

(请注意引号内的空格)

顺便说一句,您可以使用list()函数来简化您的代码。

  list($first, $last) = explode(' ', "$fullname ");

这不是真的,如果explode函数没有找到你要查找的字符串,它会返回一个只有一个元素且该元素为完整文本的数组。 - Khriz
4
需要赋值的变量个数与分割字符的数量应该相同,例如 list($size, $ctype, $sample, $desc) = explode(',', $item.',,,,');,这样可以确保总是能正确地进行赋值。 - sherpya
小心使用这个技巧,因为在explode函数中的第三个参数可能会有些棘手,例如:$string = 'abc abc'; list($first, $last) = explode(' ', "$string ", 2);。$last的结果是:"abc ",末尾带有空格! - instead
这是一个很棒的技巧。为了进一步简化您的代码,您根本不需要使用list()函数:[$first, $last] = explode(' ', "$fullname "); - phoenix
在PayPal IPN监听器代码中有效的是 explode("=", "$lines[$i]="); - 添加 = 可以避免返回的POST字符串中没有 = 时出现错误。 - Steve

21

使用array_pad

例如:$split = array_pad(explode(' ', $fullname), 2, null);

  • explode将把您的字符串拆分成一个数组,没有任何限制。
  • array_pad会用null值填充拆分后的数组,如果其条目数少于2个。

请参见array_pad


5
这可能是因为$fullname中没有包含空格字符所致。
这个例子应该可以解决你的问题,而不会显示此通知:
$split = explode(' ', $fullname, 2);
$first = @$split[0];
$last = @$split[1];

现在如果$fullname"musoNic80",你将不会收到通知消息。

请注意使用"@"字符。

希望对您有所帮助 Elias


3
有道理,但我宁愿找到一种解决问题的方法而不是压制错误。不过感谢您解释原因! - musoNic80

4

顺便说一下,那个算法并不总是有效。考虑像“De Castro”、“Dela Cruz”、“La Rosa”等两个字的拉丁或意大利姓氏,split函数会返回3个单词而不是2个:

Array {
  [0] => 'Pedro'
  [1] => 'De'
  [1] => 'Castro'
}

您最终会得到类似于“欢迎回来Ana De”的消息或“编辑Monsour La的个人资料”的消息。

对于像“Anne Marie Miller”,“William Howard Taft”等两个单词的名称也会发生同样的情况。

只是一个小提示。


explode(' ', $fullname, 2) 中的第三个标志更改为 explode(' ', $fullname, 1) 即可解决此问题。 - SQueryL

3

可以推测,$fullname中不包含空格,因此$split是一个只有一个元素的数组,所以$split[1]指向了一个未定义的偏移量。


2

array_pad 是本主题中唯一有效的答案,其他所有方法都是丑陋的技巧,可能会导致错误。使用 array_pad 可以确保元素数量正确且已填充。当与 list() 类型输出一起使用时尤其重要。


1

很奇怪,在这里它正常工作。当我尝试使用字符串the cat walks或只是the时,都不会产生错误。我已经用print_r输出了它。

你得到错误时的$fullname是什么样子的?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接