PHP如何跟踪关联数组中的顺序?
Posted
技术标签:
【中文标题】PHP如何跟踪关联数组中的顺序?【英文标题】:How does PHP keep track of order in an associative array? 【发布时间】:2011-07-16 19:18:50 【问题描述】:将新值推送到索引数组时
$array[] = 'new value';
php 文档解释了它是如何添加到 [MAX_INDEX+1] 位置的。
将新值推送到关联数组时
$array['key'] = 'new value';
它的工作原理相同,但我在文档中没有看到任何解释来确认它如何或为什么这样做。在我的实施中,顺序似乎是一致的,但我如何确定顺序将保持不变?有谁知道 PHP 是如何在后端实现的?
【问题讨论】:
相信实现细节可以在zend_hash.c找到。我假设索引是分开的,->pInternalPointer
显示最后一个。
它们可能只是链接哈希映射。无论散列如何,链接都会提供顺序。
很好的答案!正是我想要的! :-)
【参考方案1】:
MAX_INDEX 实际上与排序无关。 你可以做
$array[5] = 'new value';
$array[1] = 'new value';
$array[105] = 'new value';
$array[2] = 'new value';
这个数组也会保持这个顺序。
PHP 数组是一个有序的映射,所以,它是一个保持有序的映射。 数组元素只是保持顺序,因为它们被添加 就是这样。
【讨论】:
【参考方案2】:所有 PHP 数组,无论是数字数组还是关联数组,都被实现为所谓的“有序哈希表”。这是一个数据科学术语,相当于:“一个合理的快速键值存储,跟踪键和值的插入顺序”。换句话说,PHP 数组有一些内存用于记忆顺序。每次你往里面放东西时,PHP 也会自动把订单放在那里。
有趣的是,数字键也会发生这种情况——因此,如果将值 1、2、3、4、5 放入 PHP 数组中,PHP 仍会单独跟踪顺序。如果这听起来很浪费,那是因为它是!然而,它确实节省了大脑周期,可以用来解决其他人的问题,无论是真实的还是想象的。
【讨论】:
【参考方案3】:How are associative arrays implemented in PHP? 可能会给你一些见解。
似乎 PHP 数组本质上是哈希表,因此数组的顺序将保持不变,直到您重新排序(例如,通过对数组进行排序)。
编辑:这似乎被否决了,请允许我在下面的评论中明确包含我链接到的来源......
“PHP 关联数组实际上是 HashTables 的一种实现”,来自 How is the PHP array implemented on the C level?
同样来自该来源:“PHP 数组是一个链式哈希表(在键冲突时查找 O(c) 和 O(n)),它允许使用 int 和 string 键。它使用 2 种不同的哈希算法将这两种类型放入同一个哈希键空间。”
来自http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html的“一切都是哈希表”
【讨论】:
对死灵术感到抱歉,但这个答案毫无意义。如果它是一个简单的哈希表,条目的顺序应该基于每个键的哈希值,而不是插入的顺序。事实上,这就是哈希表在任何其他语言中的行为方式。然而 PHP 关联数组似乎可以跟踪插入的顺序。所以这个问题对我来说仍然是开放的。它是如何做到的?可以信赖吗? ***.com/questions/2350361/… nikic.github.io/2012/03/28/… @Tobia,显然存储在哈希中的每个值都链接到存储在它之前的值和存储在它之后的值作为链表。这样就解释了顺序。【参考方案4】:我更喜欢依赖ksort。根据我的经验,在您开始删除元素之前,数组会保持一致。最好手动对它们进行排序,并知道它们是否按您想要的顺序排列。
【讨论】:
我记得在删除元素和对数组排序时遇到了麻烦。可能只是我的编程很糟糕,但让我养成了在依赖数组时总是定义数组顺序的习惯。以上是关于PHP如何跟踪关联数组中的顺序?的主要内容,如果未能解决你的问题,请参考以下文章