在PHP中,字符串可以被视为数组。

11
我知道在php中字符串是......的,但是例如我可以这样做:
$str = 'String';
echo $str[0];
echo $str[1];

//result
S
t

echo count($str)
//result
1

为什么我可以像在数组中一样遍历它们,但不能用count计数?(我知道可以使用strlen())

1
因为使用[]对字符串进行索引是语法糖。在PHP中,字符串不是数组。 - Tomalak
2个回答

24

因为这就是它的工作方式。您可以使用括号符号访问特定的字节偏移量。但这并不意味着字符串是一个数组,也不能对其使用期望数组的函数。$string[int] 只是一种语法糖,等同于 substr($string, int, 1) ,没有多余的含义。


我更愿意称它们为“字符偏移量”,但你对于语法糖的说法是正确的。 - GolezTrol
3
哈哈,评论时机恰当。好吧,它们 不是 字符偏移量!尝试: $s = '漢字'; $s[1]; - deceze
1
“字节偏移量”就是它的本意,它不是代码点或字符。请参阅《每个程序员绝对、肯定需要了解编码和字符集以处理文本》(http://kunststube.net/encoding/)。至于PHP未来会做什么,完全是开放性的问题;据我所知,在可预见的未来内,不会有基于字符的字符串出现。 - deceze
文档中说:“可以通过在字符串后使用方括号指定所需字符的基于零的偏移量来访问和修改字符串中的字符,例如 $str[42]。就此目的而言,请将字符串视为字符数组。”问题是,您(基本上是非法地)将Unicode信息放入PHP认为是ANSI字符串的内容中。尽管它们相同,但$str[n]仍然指的是ANSI代码点而不是字节,这使您能够提取Unicode字符的单独字节。 - GolezTrol
2
在PHP中,访问字符串的字节(而不是字符)仅仅是语法糖的观念是错误的,因为你可以使用索引分配(更改)字符串中的字节,但不能使用substr进行此类更改。使用索引,PHP允许您将字符串视为任意内存块,以处理各种非文本数据源。 - Greg Young
显示剩余3条评论

8

由于字符串不是数组,所以它们允许您使用相同的语法查找字节偏移量(在多字节字符字符串中不一定是字母)以方便使用,但只能做到这一点。

数组也可以有键,并且可以进行排序。如果字符串是完整的数组,您可以为每个字母分配一个键,或者使用其中一个数组函数按字母顺序排序。

长话短说:尽管它们的语法的某些部分相似,但字符串不是数组。


1
我认为区分“字母”和字节偏移量很重要。 :) - deceze

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