Are PHP Associative Arrays ordered?

我来自 python 背景和 python 数据类型相似(一个字典)是一组 无序键值对。

我想知道 PHP 关联数组是否是无序的? 它们似乎是有序的。

$test = array(
'test' => 'test',
'bar' => 'bar',
);


var_dump($test);


var_dump(array_slice($test, 0, 1));

测试总是出现在 bar 之前,我可以像你看到的那样切割这个数组。那么,是否总是保证在不同的 php 版本之间进行排序呢?顺序仅仅是我用来声明数组的顺序吗?所以有东西在内部指向“ test”将[0]放到数组中?我已经阅读了 http://php.net/manual/en/language.types.array.php,但它并没有在这个问题上阐明太多。谢谢你的回答。泰

27804 次浏览

PHP 关联数组(以及数字数组) 已经定好了和 PHP 提供各种函数来处理数组键排序,如 ksort()uksort()krsort()

此外,PHP 允许您用数字键声明无序的数组:

$a = array(3 => 'three', 1 => 'one', 2 => 'two');
print_r($a);


Array
(
[3] => three
[1] => one
[2] => two
)
// Sort into numeric order
ksort($a);
print_r($a);
Array
(
[1] => one
[2] => two
[3] => three
)

根据文件:

PHP is actually an ordered map中的数组。映射是将值与键相关联的类型。这种类型针对几种不同的用途进行了优化; 它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列,可能还有更多。由于数组值可以是其他数组,所以树和多维数组也是可能的。

文件指出:

An array in PHP is actually an ordered map.

因此,是的,它们总是有序的。数组实现为 哈希表

来自 Php 手册:

数组 是有序的。可以使用各种排序函数来更改顺序。有关更多信息,请参见 array functions部分。

我所依赖的事实是,它们是有序的,并且在我所做的每个项目中都始终如一地工作。

数组是有序的,但这并不意味着键是有序的,这意味着它们是 给予顺序的。其中未指定精确顺序,但似乎是您在其中引入键-值对的顺序。

为了理解它,想想不被命令意味着什么? 想想关系数据库里的亲戚。 关系不是按 本质上顺序排列的: 当您使用查询访问它时,除非您提供 秩序子句,否则数据库可以以任意顺序返回相同的数据。 即使数据没有被修改,相同的数据也可以按不同的顺序返回。