75

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

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

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

var_dump($test);    

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

测试总是在 bar 之前,我可以像你看到的那样对这个数组进行切片。那么这是否总是保证跨 php 版本订购?顺序只是我声明数组的顺序吗?那么有什么东西在内部指向“测试”以将 [0] 放在数组中?我已经阅读了http://php.net/manual/en/language.types.array.php但它并没有对这个问题有太多的了解。我很欣赏你的回应。泰

4

4 回答 4

71

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中的数组实际上是一个有序映射。映射是将值与键相关联的类型。这种类型针对几种不同的用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。由于数组值可以是其他数组,因此树和多维数组也是可能的。

于 2012-06-06T13:02:07.793 回答
11

文档指出:

An array in PHP is actually an ordered map.

所以是的,它们总是被订购的。数组被实现为哈希表

于 2012-06-06T13:02:58.370 回答
3

数组是有序的,但这并不意味着键是排序的,这意味着它们是按给定的顺序排列的。没有指定确切的顺序,但它似乎是您在其中引入键值对的顺序。

要理解它,想想不被订购意味着什么?想想关系数据库中的关系。关系本质上不是有序的:当您通过查询访问数据库时,除非您提供order子句,否则可以以任何顺序返回相同的数据。即使数据没有被修改,相同的数据也可以以不同的顺序返回。

于 2020-08-02T17:16:56.997 回答
2

php 手册

数组是有序的。可以使用各种排序功能更改顺序。有关详细信息,请参阅数组函数部分。

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

于 2012-06-06T13:03:31.590 回答