是否已订购PHP关联数组?


71

我来自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,但是在这个问题上并没有太多启示。感谢您的回复。泰


12
其中一些答案参考PHP手册,该手册指出数组是有序的。但这根本不能回答最初的问题。被问的是(默认)顺序是什么!默认顺序似乎是分配元素的顺序,但是文档在哪里说明我们可以指望从一个版本到另一个版本呢?
flymike '16

5
我在bugs.php.net/bug.php?id=76119上提出了一个有关缺乏文档的问题,事实证明,该顺序始终是将键添加到数组的顺序(仅更改数组元素的值不会更改数组的顺序)。语言规范可以在github.com/php/php-langspec/blob/master/spec/12-arrays.md
Mikko Rantalainen

1
在Python3.6及更高版本中,它们是有序的。
鲍勃

Answers:


66

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


10

文档指出:

An array in PHP is actually an ordered map.

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


1
当然,我读了第一句话,但我仍然感到困惑。我意识到,如果我有一个$ test = array('foo','bar'),则命令$ test [0]为foo,$ test [1]为bar。但是,当我有一个关联数组时,键不是按数字顺序排列的。$ test ['test']现在排在第一位,但是没有数字索引,而是由字符串索引,这就是为什么我感到困惑和张贴的原因。
dm03514 2012年

1
@ dm03514我不确定我能得到你。但是PHP中的所有数组实际上都是关联数组。希望能有所帮助。
alexn 2012年

@mikegreiling同意,更改。谢谢!
亚历克斯


0

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

要了解它,请考虑不下订单意味着什么?好想一下关系数据库中的关系。关系不是固有排序的:当您通过查询访问它时,除非您提供order子句,否则数据库可以按任何顺序返回相同的数据。即使未修改数据,也可以按不同顺序返回相同数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.