2011-03-16 165 views
8

当按下一个新的值到一个索引数组PHP如何跟踪关联数组中的顺序?

$array[] = 'new value'; 

PHP文档解释了它如何被在[MAX_INDEX + 1]位置加入。

当推一个新值到一个关联数组

$array['key'] = 'new value'; 

它的工作原理是相同的,但我没有看到任何解释文件以确认如何或为何它这样做。该命令似乎在我的实施中是一致的,但我怎么知道订单将保持不变?有谁知道PHP如何在后端实现这一点?

+2

我相信实施细则都在[zend_hash.c(http://svn.php.net/viewvc/php/php被发现-src /中继/ Zend的/ zend_hash.c?视图=标记)。索引保持独立我假设,并且' - > pInternalPointer'显示最后。 – mario 2011-03-16 17:42:20

+1

它们可能只是链接哈希映射。链接提供顺序而不管哈希。 – 2011-03-16 17:54:32

+0

伟大的答案!正是我在找的! :-) – 2015-01-17 18:33:43

回答

0

How are associative arrays implemented in PHP?可能会给你一些见解。

似乎PHP数组基本上是哈希表,所以数组的顺序将保持不变,直到您重新排序为止(例如,通过对数组进行排序)。

编辑:看来这是越来越downvoted,请允许我明确包括我挂在下面这里注释的源...

+6

对不起死灵,但这个答案没有意义。如果它是一个简单的散列表,条目的顺序应该基于每个键的散列值,而不是插入顺序。实际上,这就是哈希表在其他语言中的表现。然而PHP关联数组似乎跟踪了插入的顺序。所以这个问题对我来说还是开放的。它是如何做到的?它可以依赖吗? – Tobia 2014-07-02 16:58:10

+0

http://stackoverflow.com/questions/2350361/how-is-the-php-array-implemented-on-the-c-level – n00dle 2014-07-03 08:40:22

+0

http://nikic.github.io/2012/03/28/Understanding -PHPs内部阵列-implementation.html – n00dle 2014-07-03 08:41:59

2

MAX_INDEX实际上与排序无关。
你可以做

$array[5] = 'new value'; 
$array[1] = 'new value'; 
$array[105] = 'new value'; 
$array[2] = 'new value'; 

和阵列将保留该顺序为好。

PHP数组是一个有序的映射,所以它是保持它的顺序的映射。
数组元素只是在添加它们之后保持顺序(或者它完全由某个数组操作函数修改)。这就是全部。

0

我宁愿依靠ksort。根据我的经验,在开始移除元素之前,数组保持一致。最好手动对它们进行排序,并知道它们的顺序是你想要的。

+0

删除元素有什么问题? – 2011-03-16 17:46:11

+0

我记得在删除元素和排序数组时遇到了问题。可能只是我的编程不佳,但却导致我习惯于总是定义数组的顺序,如果我依赖它的话。 – Ryre 2011-03-16 17:57:06