我目前正在学习Symfony,其中很大一部分是条令。我一直在阅读Doctrine的官方文档,在关于收藏库的部分,我偶然发现了一个叫做"有序地图"的东西。我试着在谷歌上搜索,但没有找到任何令人满意的答案。只有特定语言(主要是Java和C++(的答案,但我想大致理解它。它是如何工作的以及它是什么,因为在条令文件中,他们将它与ArrayCollection进行了比较,所以我希望如果我能理解它是什么的话,我也会更容易理解ArrayColletion。
我试着搜索"什么是有序地图"或"有序地图解释"之类的东西,但正如我之前所说,我没有找到我要找的东西。
当条目保持在插入它们的相同序列中时,映射有时被称为有序。
例如,PHP中的数组是按顺序排列的(保留插入顺序(。因此,创建/修改这样的数组:
$array = [2 => 'a', 1 => 'b'];
$array[0] = 'c';
确实会产生PHP数组[2 => 'a', 1 => 'b', 0 => 'c']
——它保留了插入顺序——而在其他一些语言中,它会变成[0 => 'c', 1 => 'b', 2 => 'a']
。
这会影响一些操作。使用foreach
在数组上迭代将按插入顺序返回条目。您可以对PHP数组进行按键或按值排序,默认排序函数sort
将丢弃原始键并以数字形式重新索引。使用数字键进行序列化和反序列化可能会产生意想不到的后果。还有一些其他效果,有时是有益的,有时是令人惊讶或讨厌的(或两者兼有(。您可以在PHP的数组文档页面和数组函数页面上阅读大量内容。
在Doctrine的上下文中(因为它是用PHP编写的(,这意味着,一个值是实体对象的集合可以按照你想要的任何方式排序(当然包括id(,如果你迭代该集合,你会按照Doctrine添加实体对象的顺序(SQL/DQL查询的顺序(获得实体对象。Doctrine还允许设置实体id的密钥,同时仍然保留SQL/DQL查询顺序。这可以简化代码,因为Doctrine的Collection
实现了PHP的ArrayAccess
。
举个反例,映射也可以是无序的或排序的,其中第一个表示当您检索对时,顺序可以是随机的(在golang中,迭代映射时的起始索引曾经是随机的,不知道这是否仍然是真的(或自动排序的(如Java中的SortedMap
(。