【问题标题】:PHP associative array's keys (indexes) limitations?PHP关联数组键(索引)限制?
【发布时间】:2012-03-18 18:58:49
【问题描述】:

如果 PHP 中的数组键有某种限制?长度 ?不可接受的字符串?

official documentation中只找到了这个,但是没有关于keys限制的信息。

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

【问题讨论】:

    标签: php arrays key


    【解决方案1】:

    What is the max key size for an array in PHP?

    这个问题几乎完全相同。但是,如果您不想信任任何非官方的东西,那就坚持使用较少的小密钥。您甚至可以从中获得一些性能优势。

    编辑:正如The PHP Manual 所说:

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

    【讨论】:

    • 听起来不错。对于某些特定的数据处理,我需要长密钥,因此不存在性能问题,只是功能问题。需要检查是否也没有“禁止”字符,这是问题的第二部分。
    • 字符串没有禁止字符。但是请注意字符串 / 中的反斜杠,因为它会转义下一个字母。
    • 减一用于引用 PHP 文档中的“长字符串没有问题”注释。这并不一定意味着数组中的长键不是问题,出于性能或其他原因。这可能是真的,但引用的注释并没有这么说。
    • 我对 PHP 5.3 做了一些性能测试,结果表明密钥长度肯定会影响性能:gist.github.com/MarkMaldaba/a6f44f1da32080328b11。我没有在以后的 PHP 版本上重新测试过,但是如果你想尝试一下,代码就在那里。
    【解决方案2】:

    在数组中用作键的任何字符串都会被散列。类似于 md5() 和 sha1() 这种散列将(可能是千兆字节的)字符减少到已知长度。与 md5() 或 sha1() 不同,数组的内部散列机制会将您的字符串转换为整数,然后可以使用它来寻址数组中的存储桶。 PHP 的数组不是真正的/真正的数组——它们在内部是某种 Linked HashMap。考虑到多个字符串可以归结为同一个哈希,每个桶本身就是一个列表。如果同一个桶中有多个元素,则必须评估每个键。不用说,短键的比较速度比 1MB 的文本要快。

    TL;DR:虽然你不受 PHP 的限制,但你应该限制自己。如果您有相当长的字符串,请考虑通过 md5() 或 sha1()(或任何其他散列函数,实际上)运行它们以减少密钥长度。

    【讨论】:

    • 不知道,内部散列的密钥是什么,感谢您的解释。确实,制作一个额外的 md5 以减少密钥长度听起来不错。
    • 你是不是有点自相矛盾?如果字符串在内部进行散列,为什么要散列“相当长”的字符串呢?更不用说你会失去唯一性的理论保证(因此你会做什么?你会用列表等重新发明整个数据结构吗?)你的 TL;DR 部分似乎与第一段相矛盾,我没有看到任何推理在它后面。
    【解决方案3】:

    您确定您指的是密钥吗?还是你的意思是价值?

    使用关联数组: $数组 = 新数组( 新数组( “键”=>“值” ) );

    .. 至于密钥,我认为理论上没有长度限制,但是.. 如果您想大量重复使用它们,那么选择长密钥并不是一个好主意..

    至于值,您通常应该在数组中掠夺一下,以及允许使用哪些数据类型等等。

    希望这会有所帮助..

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 2015-08-18
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2011-05-04
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多