带大括号的类数组语句 - 目的是啥?
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 做出贡献的新手,因此我很感谢您的指点。以上是关于带大括号的类数组语句 - 目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章