PHP中“关联”和“索引”数组之间的实际差异是什么?

时间:2009-08-25 18:27:09

标签: php arrays data-structures language-design

PHP数组类型实际上更类似于有序映射而不是传统C数组。它是PHP的原始通用数据结构。该手册尽可能地说The indexed and associative array types are the same type in PHP, which can both contain integer and string indices

然而,在很多情况下,内置语言功能将区分“索引”数组(具有顺序,整数键的数组)和“关联”数组(具有非顺序和/或混合键的数组)类型)。

这方面的一个例子是array_merge功能。

  

如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个键。但是,如果数组包含数字键,则后面的值不会覆盖原始值,但会附加。

     

如果只给出一个数组并且数组被数字索引,那么键将以连续的方式重新索引。

PHP的其他地方有哪些区别在索引和关联数组之间?我对Userland的差异特别感兴趣,尽管对PHP源代码中的Array实现有任何了解也很有趣。

5 个答案:

答案 0 :(得分:5)

实际上,任何数组,无论是索引还是关联,都是PHP中的哈希表(加上用于维护元素顺序的双向链表)。但是,在用户态PHP代码中,索引和关联数组几乎总是用于不同的目的,有时需要以不同的方式处理,因此像sort / asort这样的函数只是为了方便区分它们。

答案 1 :(得分:3)

最常见的一个问题是索引数组可以使用传统的for循环进行循环,而关联数组则不能(因为它没有数字索引):

for ($i = 0; $i < count($indexed_array); $i++)
{
  // do something with $indexed_array[$i]
}

当然,php也有一个foreach关键字,两种类型的工作方式相同。

答案 2 :(得分:3)

..然后有SplFixedArray,从5.3开始,它只支持整数索引,具有固定的大小,通常比本机数组更快。

答案 3 :(得分:2)

我发现一个有趣的区别是使用json_encode

json_encode(array(0=>0,1=>1,2=>2));
> [0,1,2]
json_encode(array(0=>0,2=>2));
> {"0":0,"2":2}

作为一个单独的例子,这是有道理的,但与array_filter结合使用时更令人惊讶。

$f = function($x) { return $x != 1; };
json_encode(array_filter(array(0,1,2), $f));
> {"0":0,"2":2}

我们从数字数组开始,过滤掉一些元素,但生成的json是一个关联数组!


请注意,我们可以使用array_values来获取所需的json。

json_encode(array_values(array_filter(array(0,1,2),$f)));
> [0,2]

答案 4 :(得分:0)

几乎所有核心​​排序功能(包含所有sortksortasort变体,具体取决于您是否要维护密钥关联等等。

相关问题