20

我写了我认为非常简单的使用 phpexplode()函数将名称拆分为名字和姓氏的内容:

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

但是,这会引发带有消息的 php 错误"Undefined offset: 1"。该功能似乎仍然有效,但我想清除导致错误的任何原因。我检查了php 手册,但他们的示例使用与上面相同的语法。我想我明白什么是未定义的偏移量,但我不明白为什么我的代码会产生错误!

4

7 回答 7

50

这是因为您的全名不包含空格。您可以使用一个简单的技巧来确保空间始终位于

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

(注意引号内的空格)

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

  list($first, $last) = explode(' ', "$fullname ");
于 2009-11-27T10:18:22.810 回答
16

采用array_pad

情商: $split = array_pad(explode(' ', $fullname), 2, null);

  • explode会将您的字符串拆分为一个没有任何限制的数组。
  • array_padnull如果它有少于2条目,将用值填充展开的数组。

array_pad

于 2019-07-10T13:04:32.587 回答
5

这可能是因为它$fullname不包含空格字符。

此示例应该可以解决您的问题,但不显示此通知:

$split = explode(' ', $fullname, 2);
$first = @$split[0];
$last = @$split[1];

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

注意"@"字符的使用。

HTH 埃利亚斯

于 2009-11-27T10:16:56.123 回答
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”等两个词的名字上。

只是一个提示。

于 2011-04-14T05:46:13.037 回答
3

据推测,无论$fullname是什么都不包含空格,因此$split包含单个元素的数组也是如此,因此$split[1]指的是未定义的偏移量。

于 2009-11-27T10:16:36.887 回答
2

array_pad是这个线程中唯一有效的答案,所有其他都是丑陋的黑客,可以爆炸到你的脸上。有了array_pad您,您始终可以确保元素的数量是正确和填充的。list()与类型输出一起使用时尤其重要。

于 2019-09-10T08:12:12.263 回答
1

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

当你收到错误时,你的$fullname样子是什么?

于 2009-11-27T10:17:38.590 回答