php数组键中允许的字符?

cgw*_*cts 80 php arrays key

我有一些php数组键,填充了很多奇怪的字符.

这是允许的吗?对我不能使用的东西有任何限制吗?

Cor*_*bin 83

根据手册:

密钥可以是整数或字符串.值可以是任何类型.

此外,还会发生以下关键演员:

  • 包含有效整数的字符串将强制转换为整数类型.例如,键"8"实际上将存储在8下.另一方面,"08"将不会被转换,因为它不是有效的十进制整数.
  • 浮点数也会转换为整数,这意味着小数部分将被截断.例如,密钥8.7实际上将存储在8下.
  • Bool也会被转换为整数,即键值true实际上将存储在1下,键值false则在0下.
  • Null将被转换为空字符串,即键null实际上将存储在""下.
  • 数组和对象不能用作键.这样做会导致警告:非法偏移类型.

手册再次:

字符串是一系列字符,其中字符与字节相同.这意味着PHP仅支持256个字符集,因此不提供本机Unicode支持.查看字符串类型的详细信息.

简而言之,任何字符串都可以成为关键.字符串可以包含任何二进制数据(最多2GB).因此,密钥可以是任何二进制数据(因为字符串可以是任何二进制数据).

一些随机(有效)滥用数组键:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);
Run Code Online (Sandbox Code Playgroud)

  • 当然,核心不包含*操纵*Unicode字符串的任何工具.但只要你不想操纵字符串,PHP就支持它们就好了.实际上,默认情况下,几乎每个PHP安装都可以使用MB扩展,因此"核心支持"与否之间的区别主要是学术性的.:) (2认同)

Mat*_*hew 12

密钥必须是字符串或整数.有一些演员阵容发生,但我认为手册很好地解释了:

密钥可以是整数或字符串.值可以是任何类型.

此外,还会发生以下关键演员:

  • 包含有效整数的字符串将强制转换为整数类型.例如,键"8"实际上将存储在8下.另一方面,"08"将不会被转换,因为它不是有效的十进制整数.
  • 浮点数也会转换为整数,这意味着小数部分将被截断.例如,密钥8.7实际上将存储在8下.
  • Bool也会被转换为整数,即键值true实际上将存储在1下,键值false则在0下.
  • Null将被转换为空字符串,即键null实际上将存储在""下.
  • 数组和对象不能用作键.这样做会导致警告:非法偏移类型.


Rob*_*Rob 9

我找到了这个答案,寻找有关我遇到的问题的更多信息.我使用的是带有UTF-8字符的字符串,这些字符串不能作为我拥有的数组的键.

就像是

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work
Run Code Online (Sandbox Code Playgroud)

对我来说(不大或聪明)的解决方案是这样做..

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!
Run Code Online (Sandbox Code Playgroud)

  • 您使用的是旧版本的 PHP 吗?您的第一个示例在 PHP 7.1 中运行良好。 (4认同)
  • 我的答案现在已经非常过时了——它是旧版本的 PHP。另外 bin2hex 可能性能更高。尽管 md5 极有可能是唯一的,但在这种情况下,两者都不需要,因为最近的 PHP 版本中不存在该错误。 (3认同)
  • 幸运的是,您的第一个示例现在可以工作了:) (2认同)
  • 我喜欢 md5() 用于生成数组键。即使在这一点上它不是完全必要的,它仍然感觉更安全。 (2认同)

Mar*_*c B 5

你可以填入PHP字符串的任何东西都可以用作数组键.允许的字符数没有限制.

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok
Run Code Online (Sandbox Code Playgroud)


dec*_*eze 5

PHP数组键可以是整数或字符串.PHP字符串是字节数组,意味着字节序列.没有其他类型的字符串,PHP不会对数组键字符串施加任何特殊限制.换句话说:只要它是一个字符串,任何事情都会发生.