PHP:字符串索引

23

在字符串$str$中,$str[n]$和$str{n}$有什么区别?

我注意到它们似乎都可以起到相同的作用,但是我没有在任何文档中找到关于{}的使用。


我在string documentation中找到了这个信息:"注意:字符串也可以使用大括号访问,例如 $str{42},目的相同。"(但正如答案中所述,[]语法更好)。 - Gras Double
该主题也在这个问题上进行了讨论:使用 $str[0] 获取字符串的第一个字符 - Gras Double
3个回答

40

它们是相同的。但是,他们正在摆脱{}语法,所以您应该选择[]

根据手册

使用方括号指定字符串后面基于零的偏移量来访问和修改字符串中的字符,例如$str[42]。对于此目的,请将字符串视为字符数组。当您想要提取或替换多个字符时,可以使用substr()substr_replace()函数。

注意:自PHP 7.1.0起,也支持负字符串偏移量。这些指定从字符串末尾的偏移量。以前,负偏移会发出读取的E_NOTICE(产生空字符串)和写入的E_WARNING(保留字符串不变)。

注意:在PHP 8.0.0之前,还可以使用大括号访问字符串,例如$ str {42},用于同样的目的。从PHP 7.4.0开始,这种花括号语法已弃用,并且在PHP 8.0.0中不再受支持。


5
大括号 {} 来自 Perl 哈希表的遗留物,目前正在被弃用。 - Kekoa

15

注意,$str[n]$str{n}返回的是字符串String的第n个字节,而不是第n个字符。对于多字节编码(UTF-8等),一个字符并不需要占用一个字节。

$str[0]返回字符串的第一个字节

mb_substr($str, 0, 1)返回字符串的第一个字符(包括多字节字符集)

http://php.net/mb_substr


3
值得注意的是,在 PHP 5.6 之前,mbstring 模块的默认编码不是 UTF-8 - 这可以在两个位置进行更改:在 php 脚本中使用 mb_internal_encoding('UTF-8'); 或在 php.ini 中使用 mbstring.internal_encoding='UTF-8' - Mark Fox

1
我知道这是一个旧问题,但重要的是要理解 $str[n] 不是返回第n个字符,而是第n个字节。我为此问题花了一整天的时间。有一个名字叫 $name = "Ömar",代码使用$name[0]检索第一个字母,因为 "Ö"、"Ä" 等需要多于一个字节的UTF-8格式错误字符,导致出现错误。
简而言之,在 PHP 中不要使用索引来从字符串中检索字符。

你上面的回答是:“要小心,$str[n]和$str{n}给出的是字符串的第n个字节,而不是第n个字符。” - Your Common Sense
我知道,但我只是想提供一些见解,说明可能会由此引起哪些错误。也许有人会遇到“格式不正确的UTF-8”错误,并会很高兴找到我的答案 :) - baszach

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