问题 带有大括号的类似数组的语句 - 目的是什么?


我在网上发现了这段代码,我想知道它是做什么的:

$k[$i] = ord($key{$i}) & 0x1F;

我知道 ord() 返回一个ASCII值,但我不清楚大括号的作用 $key{$i} 以及它的作用 & 0x1F


12691
2018-05-25 19:03


起源

另见 stackoverflow.com/q/8092248/632951 - Pacerier


答案:


那不是数组语法。它仅用于从字符串访问单个字符。索引必须是数字。

 $str{1} == $str[1]

它在信息框中简要提到: http://www.php.net/manual/en/language.types.string.php#language.types.string.substr

此外,它已正式宣布弃用。 它已在手册中打开和关闭,但如果不常见,语法仍然非常有效。


& 0x1F 是一个有点明智的AND。在这种情况下,它将十进制值限制为0到31。


8
2018-05-25 19:08



这个答案是不准确的。事实上,正如我在我的回答中所解释的那样,大括号语法是方括号语法的完全有效(不是已弃用)的替代方法。 mario链接的引用只强调了我的观点 - 两种形式是等价的。 - Tripartio
@Ochado好抓。这已经不再适用了。以前版本的手册 没有  将其标记为PHP 5.3已弃用,之前曾见过6.0 在DE版本中。所以更好的重复: PHP $ string {0}与$ string [0]; (我个人也暗地里一直在使用 {1} 用于装饰目的的语法,顺便说一下。) - mario
索引确实如此 不 需要只是数字。 PHP将自动进行转换。 - Pacerier
@Pacerier:我想我想暗示 is_numeric("1")。但你是对的;它更像是一个字符串指示的自定义int cast / cut。 - mario


问题的第一部分:花括号

这是关于引用变量的值。

在您的示例中,如果 $i 等于 123, 然后

$k[$i] = ord($key{$i}) & 0x1F;

会是一样的

$k[123] = ord($key[123]) & 0x1F;

问题的第二部分:'&'符号

& 是一个二元运算符。查看更多 在文档中。如果在两个变量中都设置了位,则设置这些位。


3
2018-05-25 19:06



$key[$i] 也可以使用。 - Rocket Hazmat


在PHP中,[方括号]或{花括号}是完全合法的,可互换的访问数组的方法:

注意:方括号和花括号可以互换使用来访问数组元素(例如$ array [42]和$ array {42}在上面的例子中都会做同样的事情)。

资源: http://www.php.net/manual/en/language.types.array.php

两者都完全有效;大括号不推荐使用。

关于“&0x1F”,其他像@Tadek的回复:

&是一个二元运算符。在文档中查看更多内容[http://www.php.net/manual/en/language.operators.bitwise.php]。如果在两个变量中都设置了位,则设置这些位。


3
2017-07-24 03:33



考虑从您自己的答案中删除对其他答案的评论。 - bummi
我已编辑此答案以删除您对已接受答案的评论(可能并非总是这样 是 接受的答案)。如果您认为其他答案是正确的,请考虑对其他答案进行低估和/或评论。如果您没有足够的声誉来发表评论,那就让自己的答案说明一切。 - Caleb
感谢您的评论和编辑。由于我不熟悉Stack Overflow,我很欣赏这些指针。 - Tripartio


& 0x1F 是一种逐位操作,用于“标准化”字符,颜色等的值,这些值被放入十六进制但不一定“读”相同。了解更多 维基百科在这里

& 0x1f

相当于

& 00011111

这可以有效地将任何字节大小的值的前三位设置为0。

0xff & 0x1f

结果是

0x1f

要么

11111111 & 00011111

结果是

00011111

2
2018-05-25 19:08