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

23 浏览
0 Comments

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

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

$array[] = 'new value';

PHP文档解释了它是如何添加到[MAX_INDEX+1]位置的。

当向关联数组中推送新值时,

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

它的工作方式相同,但我没有在文档中找到任何解释来确认它是如何做到的或为什么要这样做。在我的实现中,顺序似乎是一致的,但我如何确定顺序将保持不变呢?有人知道PHP是如何在后端实现这一点的吗?

0
0 Comments

PHP中的所有数组,无论是数字数组还是关联数组,都是实现为所谓的“有序哈希表”。这是一个数据科学术语,意味着:“一个合理快速的键值存储,可以跟踪键和值插入的顺序”。换句话说,PHP数组有一小部分内存用于记住顺序。每次在数组中放入一个元素时,PHP自动将顺序也放入其中。

有趣的是,这对于数字键也是适用的-所以如果你将值1、2、3、4、5放入PHP数组中,PHP仍然单独地跟踪顺序。如果这听起来很浪费,那是因为的确如此!然而,它可以节省一些脑力,这些脑力可以用来解决其他人的问题,无论是真实的还是想象的。

在PHP中,保持关联数组的顺序通常是没有问题的,因为它会按照插入的顺序来遍历数组。但是有时候,我们可能需要对数组进行重新排序或者按照其他方式进行操作。这时,我们就需要知道PHP如何跟踪关联数组的顺序,以及如何解决相关问题。

PHP使用一个内部索引来跟踪关联数组的顺序。这个内部索引是一个整数值,它表示数组中每个元素的插入顺序。当我们插入一个新的键值对时,PHP会自动更新这个内部索引的值,以反映新元素的插入顺序。

要获取关联数组的顺序,我们可以使用array_keys函数。这个函数会返回数组中所有键的一个新数组,这个新数组的顺序就是关联数组的顺序。下面是一个示例代码:

$array = array('a' => 1, 'b' => 2, 'c' => 3);
$keys = array_keys($array);
foreach($keys as $key) {
  echo $key . ' ';
}

上面的代码会输出'a b c',这就是关联数组的顺序。

如果我们想要按照特定的顺序对关联数组进行排序,可以使用usort函数。这个函数可以根据自定义的比较函数对数组进行排序。下面是一个示例代码:

$array = array('a' => 1, 'b' => 2, 'c' => 3);
function compare($a, $b) {
  return strcmp($a, $b);
}
usort($array, 'compare');
foreach($array as $key => $value) {
  echo $key . ' ';
}

上面的代码会输出'a b c',这表示关联数组按照键的字母顺序进行了排序。

总结一下,PHP通过使用内部索引来跟踪关联数组的顺序。我们可以使用array_keys函数获取关联数组的顺序,使用usort函数对关联数组进行排序。这些方法可以帮助我们在处理关联数组时保持顺序或者按照特定的顺序进行操作。

0
0 Comments

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

PHP的关联数组实际上与顺序无关。可以通过以下方式对数组进行操作,数组的顺序将保持不变:

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

PHP数组是一个有序映射,也就是说它是一个保持顺序的映射。数组元素保持添加的顺序,这就是全部内容。

0
0 Comments

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

PHP关联数组实际上是哈希表的一种实现,因此数组的顺序将保持不变,直到对其进行重新排序(例如通过对数组进行排序)。

根据下面的一些来源,PHP关联数组实际上是哈希表的一种实现:

- "PHP关联数组实际上是哈希表的一种实现",来自《How is the PHP array implemented on the C level?》(https://stackoverflow.com/questions/2350361)

- 从同一来源中得知:"PHP数组是一个链接的哈希表(在键冲突时的查找复杂度为O(c)和O(n)),允许使用整数和字符串键。它使用2种不同的哈希算法将两种类型适应到同一个哈希键空间中。"

- "Everything is a HashTable",来源于《Understanding PHP's internal array implementation》(http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html)

然而,这个答案似乎没有意义。如果它是一个简单的哈希表,条目的顺序应该基于每个键的哈希值,而不是插入的顺序。事实上,这就是其他任何语言中哈希表的行为方式。然而,PHP关联数组似乎能够跟踪插入的顺序。所以,这个问题对我来说仍然是个谜。它是如何做到的?它是可靠的吗?

根据stackoverflow.com/questions/2350361和nikic.github.io/2012/03/28/…,显然哈希表中存储的每个值都作为一个链接列表与其前一个存储的值和后一个存储的值相关联。这就解释了顺序的问题。

0