PHP如何跟踪关联数组中的顺序?

11

当向索引数组中推送新值时

$array[] = 'new value';

PHP文档解释了如何将值添加到[ MAX_INDEX+1 ]位置。

在将新值推入关联数组时

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

代码的作用一样,但文档中并没有解释它如何或为什么这样做。在我的实现中,顺序似乎是一致的,但我怎么知道它们的顺序会保持不变呢?有人知道PHP是如何在后端实现这个功能的吗?


2
我相信实现细节可以在zend_hash.c中找到。我认为索引是分开保存的,而->pInternalPointer显示最后一个。 - mario
1
它们可能只是“Linked Hash Maps”(链接哈希映射)。链接提供了排序,而不考虑哈希。 - André Paramés
非常好的答案!正是我在寻找的! :-) - John Sonderson
4个回答

3

PHP中的所有数组,包括数字数组和关联数组,都被实现为所谓的“有序哈希表”。这是一个数据科学术语,意味着:“一个合理快速的键值存储,用于跟踪插入键和值的顺序”。换句话说,PHP数组有一点内存用于记住顺序。每次您向其中放置某些内容时,PHP会自动将其顺序放入其中。

有趣的是,这也适用于数字键-因此,如果您将值1,2,3,4,5放入PHP数组中,PHP仍然会单独跟踪顺序。如果听起来很浪费,那是因为它确实如此!但它可以节省大脑的运转能力,这些能力可以用来解决其他人的实际或想象中的问题。


3

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

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

这个数组也会保持顺序。

PHP数组是一个有序的映射,因此它是一个保持顺序的映射。
数组元素只是按照添加的顺序保留,仅此而已。


1

PHP中如何实现关联数组?或许可以给你一些启示。

看起来PHP数组本质上是哈希表,因此数组的顺序会保持不变,直到你重新排序它(例如通过对数组进行排序)。

编辑: 看来这篇文章正在被踩,让我明确地在这里包含我在下面评论中链接的来源...


8
抱歉打扰了,但是这个回答没有意义。如果它只是一个简单的哈希表,每个键的顺序应该基于其哈希值,而不是插入的顺序。事实上,在其他任何语言中,哈希表都是这样工作的。然而,PHP关联数组似乎会跟踪插入的顺序。所以我的问题仍然存在。它是如何做到的?可以信赖吗? - Tobia
https://dev59.com/H3E95IYBdhLWcg3wWMhQ - n00dle
http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html - n00dle
@Tobia,显然哈希表中存储的每个值都与其之前和之后存储的值链接成一个链表。这就解释了顺序。 - Leopoldo Sanczyk

0

我更喜欢依赖于ksort。在我的经验中,数组在你开始移除元素之前一直保持一致。最好手动排序它们并确保它们按照你想要的顺序排列。


我记得在删除元素和排序数组方面遇到了麻烦。可能只是我的编程不好,但这让我养成了总是定义数组顺序的习惯,如果我要依赖它的话。 - Ryre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接