PHP是否以不同方式(内部)处理数字索引数组?

时间:2013-03-25 12:08:25

标签: php arrays performance

...比关联数组?

关联数组会占用更多内存吗?

$arr = array(1, 1, 1);
$arr[10] = 1;
$arr[] = 1; // <- index is 11; does the array become associative here?

4 个答案:

答案 0 :(得分:6)

简而言之,PHP没有非关联数组。

@Sectus已经发布了一个很好的答案,重新启动PHP数组的底层实现。理解“引擎盖下”发生的事情通常是有益的。但无论它们的底层实现如何,PHP数组都是公开给PHP开发人员,作为与键相关联的值的有序映射(即关联的数组)。总是

来自PHP:Arrays - Manual

  

PHP中的数组实际上是一个有序的映射。映射是一种将值与键关联的类型。

  

PHP数组可以包含整数和字符串键,因为PHP不区分索引数组和关联数组。

  

密钥可以是整数或字符串。

数组被数字索引的错误观念是由于在没有明确指定密钥的情况下整数键自动递增的特性引起的。

但是请注意,即使所有键都是整数,也不能保证PHP中存在例如$ arr [0]的项目,据我所知,这是所做的任何其他语言使用索引数组(也就是说,假设索引数组包含至少一个元素,并且基于0)。

这不是一个微不足道的区别。依赖于PHP数组的IMHO程序员表现得像索引数组而没有考虑到潜在的后果或对差异的理解* 可能会为自己(或未来的维护者)设置奇怪/意外的行为。

*我已经对此进行了限定,因为有明显的情况是通知决定利用围绕数组的PHP语言的类似索引的便利/功能可以提供好处。

答案 1 :(得分:4)

PHP中的数组总是一个哈希表。您可以阅读@NikiC的this article

  

基本上,PHP中的所有内容都是哈希表。不仅在PHP数组的底层实现中使用了哈希表,它们还用于存储对象属性和方法,函数,变量以及其他所有内容。

如果按键从0逐个按顺序排列,看起来像索引数组,但实际上并非如此。

this article也很有用。

  

PHP数组同时是数组,字典和链表,确实需要很多信息

答案 2 :(得分:1)

所有PHP数组都是关联的。 PHP没有其他语言那样的“列表”。数字索引数组仅仅是具有数字键的关联数组。数字键有些特殊,因为在添加项时可以省略它们,从而导致PHP自动索引这些项。内部数字索引可能使用或不使用不同的索引类型(不确定,如果你想查看源代码),但是它们使用相同的机制,它们不代表一个截然不同的数组类型不同的表现特征。

答案 3 :(得分:0)

在这种情况下,数组变为关联的。 所有PHP数组都是某种关联数组,并作为哈希表实现。