PHP中的字符串真的是一个字符数组或其他东西?

时间:2011-09-10 12:52:34

标签: php arrays string foreach character

考虑

$foo = "abcdefg";

echo $foo[0]; //outputs a

所以看起来字符串就像字符数组一样但是为什么

foreach($foo as $char)
{
echo $char;
}

不起作用并给出以下警告?

Warning: Invalid argument supplied for foreach() 

4 个答案:

答案 0 :(得分:1)

foreach添加字符串迭代支持discussed but declined。这个决定主要有两个原因:

  • 它使应用程序更难调试。通常,您不希望迭代字符串的字符。你很少需要它。因此,如果你迭代一个字符串,你可能只是编程错误 - PHP会告诉你。如果引入了字符串迭代,则很难发现这种错误。
  • 什么是“角色”? PHP应该迭代每个字节吗?它应该迭代字符(可以是多个字节)吗?如果是这样,如果它遇到格式错误的多字节序列应该怎么做?它从哪里得到了charset?

为了解决这两个问题,我们提出了一个引入TextIterator的提议,你可以传递一个字符串和一个字符集。这样你就不会意外地迭代一个字符串,并且字节与字符问题不存在。我不确定TextIterator目前的状态是什么。

答案 1 :(得分:1)

NikiC的答案涵盖了为什么不能直接这样做。

如果你想迭代一个字符串就好像它是一个数组一样,你可以使用str_split来明确:

foreach(str_split($foo) as $char) 
{ 
    echo $char; 
} 

警告: str_split无法识别编码,因此您最终将通过字节而不是字符进行迭代。迭代字符更复杂,因为没有等效的多字节拆分功能。您可以使用启用了正则表达式的mb_split自行推送,查看comments from PHP.net的提示。

这里还有其他答案表明你应该将字符串转换为数组,但我不明白为什么会这样。 documentation非常明确:

  

对于任何类型:整数,浮点数,字符串,布尔值和资源,   将值转换为数组会生成具有单个数组的数组   索引为零的元素和标量的值   转换。换句话说,(数组)$ scalarValue与完全相同   阵列($ scalarValue)。

确实,这样做does not work as suggested

答案 2 :(得分:0)

即使他们的角色可以使用方括号strings aren't arrays来解决。强调我的:

  

可以通过使用方形数组括号在字符串后面指定所需字符的从零开始的偏移来访问和修改字符串中的字符,如$ str [42]。将字符串视为一个字符数组用于此目的。

答案 3 :(得分:-1)

它被称为“语法糖”。

例如,在5.4中你可以像echo func()[0];这样做 并不意味着一个函数真的是一系列特征 这只是一种语法。