PHP 关联数组是有序的吗?
Posted
技术标签:
【中文标题】PHP 关联数组是有序的吗?【英文标题】:Are PHP Associative Arrays ordered? 【发布时间】:2012-06-10 11:58:51 【问题描述】:我来自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,但它并没有对这个问题提供太多的启示。我很欣赏你的回应。类型
【问题讨论】:
这些答案中有几个是指 PHP 手册,其中指出数组是有序的。但这根本不能回答最初的问题。所问的是(默认)顺序是!默认顺序似乎是分配元素的顺序,但是文档在哪里说明我们可以依靠这个从一个版本到下一个版本? 我在bugs.php.net/bug.php?id=76119 提出了一个关于缺少文档的问题,结果发现顺序始终是键添加到数组中的顺序(仅更改数组元素的值不会更改顺序的数组)。可以在github.com/php/php-langspec/blob/master/spec/12-arrays.md 找到语言规范 在Python3.6及以上是有序的。 【参考方案1】:PHP 关联数组(以及数值数组)是有序的,PHP 提供了各种函数来处理数组键排序,例如 ksort()
、uksort()
和 krsort()
p>
此外,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
)
From the documentation:
PHP 中的数组实际上是一个有序映射。映射是将值与键相关联的类型。这种类型针对几种不同的用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。由于数组值可以是其他数组,所以树和多维数组也是可以的。
【讨论】:
【参考方案2】:documentation 声明:
An array in PHP is actually an ordered map.
所以是的,它们总是有序的。数组实现为hash table。
【讨论】:
当然我读了第一句话,但我还是很困惑。我意识到如果我有一个 $test = array('foo', 'bar') 它被订购 $test[0] 是 foo,$test[1] 是 bar。但是当我有一个关联数组时,键不是按数字顺序排列的。 $test['test'] 现在排在第一位,但它没有数字索引,而是由字符串索引,这就是我感到困惑和发布的原因。 @dm03514 我不确定我明白你的意思。但是 PHP 中的所有数组实际上都是关联数组。希望对您有所帮助。 @mikegreiling 同意,已更改。谢谢!【参考方案3】:数组是有序的,但这并不意味着键是有序的,这意味着它们是按给定的顺序排列的。没有指定确切的顺序,但它似乎是您在其中引入键值对的顺序。
要理解它,想想不被订购意味着什么? 想想关系数据库中的关系。 关系不是本质上 有序的:当您通过查询访问它时,除非您提供 order 子句,否则数据库可以以任何顺序返回相同的数据。 即使数据没有被修改,相同的数据也可以以不同的顺序返回。
【讨论】:
【参考方案4】:来自php manual:
Arrays 已订购。可以使用各种排序功能更改顺序。有关详细信息,请参阅array functions 部分。
我相信它们是有序的,并且在我拥有的每个项目中都始终如一地工作。
【讨论】:
以上是关于PHP 关联数组是有序的吗?的主要内容,如果未能解决你的问题,请参考以下文章