考虑
$foo = "abcdefg";
echo $foo[0]; //outputs a
所以看起来字符串就像字符数组一样但是为什么
foreach($foo as $char)
{
echo $char;
}
不起作用并给出以下警告?
Warning: Invalid argument supplied for foreach()
答案 0 :(得分:1)
向foreach
添加字符串迭代支持discussed but declined。这个决定主要有两个原因:
为了解决这两个问题,我们提出了一个引入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];
这样做
并不意味着一个函数真的是一系列特征
这只是一种语法。