带大括号的类数组语句 - 目的是啥?

Posted

技术标签:

【中文标题】带大括号的类数组语句 - 目的是啥?【英文标题】:Array-like statement with curly brackets - what is the purpose?带大括号的类数组语句 - 目的是什么? 【发布时间】:2011-09-02 00:51:19 【问题描述】:

我在网上找到了这段 sn-p 代码,我想知道它的作用:

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

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

【问题讨论】:

另见***.com/q/8092248/632951 【参考方案1】:

问题的第一部分:花括号

这是关于引用变量的值。

在你的例子中,如果$i 等于123,那么

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

将与

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

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

& 是二元运算符。查看更多in the documentation。如果在两个变量中都设置了位,它会设置位。

【讨论】:

【参考方案2】:

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

 $str1 == $str[1]

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

此外,它已被正式宣布弃用。 它在手册中已被假定弃用,但仍然非常有效,如果不常见,语法。


& 0x1F 是按位与。在这种情况下,它将十进制值限制为 0 到 31。

【讨论】:

这个答案不准确。事实上,正如我在回答中解释的那样,花括号语法是方括号语法的完全有效(不弃用)替代方案。 mario 链接到的引用仅强调了我的观点——这两种形式是等价的。 @Ochado 很好。这不再相关。手册的早期版本did label it as deprecated for PHP 5.3,在 6.0 之前有一次,如 in the DE-version 所示。所以最好复制:PHP $string0 vs. $string[0];(我个人也一直在偷偷地使用1 语法来装饰目的,顺便说一句。) 索引只需要是数字。 PHP 会自动进行转换。 @Pacerier:我想我想暗示is_numeric("1")。但你是对的;它更像是字符串索引的自定义 int 转换/剪切。【参考方案3】:

& 0x1F 是按位运算,用于“规范化”字符、颜色等的值,这些值被放入十六进制但不一定“读取”相同。在Wikipedia here 上阅读更多信息。

& 0x1f

等价于

& 00011111

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

0xff & 0x1f

结果

0x1f

11111111 & 00011111

结果

00011111

【讨论】:

【参考方案4】:

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

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

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

两者都是完全有效的;大括号没有被弃用。

关于“& 0x1F”,@Tadek 等其他人已经回复:

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

【讨论】:

考虑从您自己的答案中删除其他答案上的 cmets。 我已编辑此答案以删除您对已接受答案的评论(可能并不总是成为已接受的答案)。如果您认为其他答案是正确的,请考虑投票和/或评论其他答案。如果您没有足够的声誉来发表评论,请让您的答案不言自明。 感谢 cmets 和编辑。由于我是为 Stack Overflow 做出贡献的新手,因此我很感谢您的指点。

以上是关于带大括号的类数组语句 - 目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

for,if循环语句可以不带大括号吗?在可以不带的情况下我的循环有错误吗?

React:带大括号的参数与不带大括号的参数之间的区别

如何删除字典外部大括号或将其不带大括号附加到列表中?

c#不带大括号的记录

带大括号的 Java 负 bigdecimal 值

带大括号的 SQL 运算符优先级