当向索引数组中推送新值时
$array[] = 'new value';
PHP文档解释了如何将值添加到[ MAX_INDEX+1 ]位置。
在将新值推入关联数组时
$array['key'] = 'new value';
代码的作用一样,但文档中并没有解释它如何或为什么这样做。在我的实现中,顺序似乎是一致的,但我怎么知道它们的顺序会保持不变呢?有人知道PHP是如何在后端实现这个功能的吗?
当向索引数组中推送新值时
$array[] = 'new value';
PHP文档解释了如何将值添加到[ MAX_INDEX+1 ]位置。
在将新值推入关联数组时
$array['key'] = 'new value';
代码的作用一样,但文档中并没有解释它如何或为什么这样做。在我的实现中,顺序似乎是一致的,但我怎么知道它们的顺序会保持不变呢?有人知道PHP是如何在后端实现这个功能的吗?
PHP中的所有数组,包括数字数组和关联数组,都被实现为所谓的“有序哈希表”。这是一个数据科学术语,意味着:“一个合理快速的键值存储,用于跟踪插入键和值的顺序”。换句话说,PHP数组有一点内存用于记住顺序。每次您向其中放置某些内容时,PHP会自动将其顺序放入其中。
有趣的是,这也适用于数字键-因此,如果您将值1,2,3,4,5放入PHP数组中,PHP仍然会单独跟踪顺序。如果听起来很浪费,那是因为它确实如此!但它可以节省大脑的运转能力,这些能力可以用来解决其他人的实际或想象中的问题。
MAX_INDEX实际上与排序无关。
你可以这样做:
$array[5] = 'new value';
$array[1] = 'new value';
$array[105] = 'new value';
$array[2] = 'new value';
这个数组也会保持顺序。
PHP数组是一个有序的映射,因此它是一个保持顺序的映射。
数组元素只是按照添加的顺序保留,仅此而已。
PHP中如何实现关联数组?或许可以给你一些启示。
看起来PHP数组本质上是哈希表,因此数组的顺序会保持不变,直到你重新排序它(例如通过对数组进行排序)。
编辑: 看来这篇文章正在被踩,让我明确地在这里包含我在下面评论中链接的来源...
来自PHP数组在C级别上是如何实现的?:"PHP关联数组实际上是哈希表的一种实现方式"
同样来自该来源:"PHP数组是一个链式哈希表(在键冲突时具有O(c)和O(n)的查找),允许使用int和string类型的键。它使用两种不同的哈希算法将这两种类型适应到同一个哈希键空间中。"
来自http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html:"一切都是哈希表"
我更喜欢依赖于ksort。在我的经验中,数组在你开始移除元素之前一直保持一致。最好手动排序它们并确保它们按照你想要的顺序排列。
->pInternalPointer
显示最后一个。 - mario