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实现有任何了解也很有趣。
答案 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)
几乎所有核心排序功能(包含所有sort
,ksort
,asort
变体,具体取决于您是否要维护密钥关联等等。