PHP关联数组的键(索引)有限制吗?

12

在PHP中,数组键是否有某种限制?长度?不可接受的字符串?

官方文档中只找到了这个内容,但是没有关于键限制的信息。

一个键可以是整数或字符串。如果一个键是标准表示的整数,它将被解释为整数(即“8”将被解释为8,而“08”将被解释为“08”)。键中的浮点数会被截断为整数。在PHP中,索引和关联数组类型是相同的类型,它们都可以包含整数和字符串索引。*

3个回答

11
任何用作数组键的字符串都会进行哈希。类似于md5()和sha1(),这种哈希可以将(潜在的千兆字节)字符缩减为已知长度。与md5()或sha1()不同,数组的内部哈希机制将转换您的字符串为一个整数,然后用它来寻址数组中的桶。PHP的数组不是真正的/实际的数组-它们在内部是一种链接哈希映射表。考虑到多个字符串可能会被归结为相同的哈希值,每个桶本身都是一个列表。如果在同一个桶中有多个元素,则必须评估每个键。不言而喻,短键比1MB的文本更快地进行比较。

简而言之:虽然您没有受到PHP的限制,但应该自我限制。如果有相当长的字符串,请考虑通过md5()或sha1()(或任何其他哈希函数)来缩短键的长度。


不知道密钥在内部是如何哈希的,感谢解释。确实,通过进行额外的md5来减少密钥长度听起来是个好主意。 - Fedir RYKHTIK
4
你是否有点自相矛盾?如果字符串已经在内部进行了哈希,为什么还需要对"相当长的"字符串进行哈希呢?更不用说你会失去理论上唯一性的保证(那么你会做什么?重新发明整个数据结构,使用列表等吗?)你的TL;DR部分似乎与第一段相矛盾,我没有看到其中的推理。 - matteo

8
PHP中数组的最大键值是多少?

这个问题几乎完全相同。但是,如果您不想相信任何非官方的东西,只需使用更小的键即可。您甚至可能会从中获得一些性能优势。

编辑:正如PHP手册所说:

注意:一个字符串变得非常大并不成问题。PHP对字符串的大小没有限制;唯一的限制是PHP运行所在计算机的可用内存。


听起来不错。我需要长键来处理一些特定的数据,所以性能不成问题,只有功能性。还需要检查是否存在“禁止”的字符,这是问题的第二部分。 - Fedir RYKHTIK
2
字符串没有禁止使用的字符。但是请注意,在字符串中反斜杠 / 会转义下一个字母。 - MichaelH
1
在 PHP 文档中引用“长字符串没有问题”的注释是不恰当的,这并不意味着数组中的长键不会出现性能或其他问题。虽然这可能是真的,但是那个被引用的注释并没有说到这一点。 - matteo
我对PHP 5.3进行了一些性能测试,结果表明关键字长度确实会影响性能。这是测试代码:https://gist.github.com/MarkMaldaba/a6f44f1da32080328b11。尽管我尚未在后续的PHP版本上重新测试过,但如果您想要尝试,代码可供使用。 - HappyDog

-2

你确定你是在引用键吗?还是指的值?

使用关联数组: $array = new array( new array( "key"=>"value" ) );

..至于键,理论上长度没有限制,但是如果您经常想要重复使用它们,选择长键不是一个好主意。

至于值,您应该查看一般数组和允许的数据类型等内容。

希望这可以帮助到您。


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