0

我目前正在尝试学习 Symfony,其中很大一部分是 Doctrine。我一直在阅读 Doctrine 的官方文档,在关于Collections 库的部分中,我偶然发现了这个叫做“有序地图”的东西。我试图在谷歌上搜索它,但我找不到任何令人满意的答案。只有特定语言(主要是 Java 和 C++)的答案,但我想总体上理解它。它是如何工作的以及它是什么,因为在 Doctrine 文档中他们将它与 ArrayCollection 进行了比较,所以我希望如果我能理解它是什么,我也会更容易理解 ArrayCollection。

我试图搜索诸如“什么是有序地图”或“有序地图解释”之类的内容,但正如我之前所说,我没有找到我要找的东西。

4

1 回答 1

1

当条目保持与插入时相同的顺序时, 有时称为有序映射。

例如,PHP 中的数组是有序的(保留插入顺序)。所以创建/修改这样的数组:

$array = [2 => 'a', 1 => 'b'];
$array[0] = 'c';

确实会产生 PHP 数组[2 => 'a', 1 => 'b', 0 => 'c']——它保留了插入顺序——而在其他一些语言中它会变成[0 => 'c', 1 => 'b', 2 => 'a'].

这会影响一些操作。遍历数组 withforeach将按插入顺序返回条目。您可以对 PHP 数组进行 key-wise 或 value-wise 排序,默认排序功能sort删除原始键并以数字方式重新索引。使用数字键进行序列化和反序列化可能会产生意想不到的后果。还有一些其他的效果有时是有益的,有时是令人惊讶或烦人的(或两者兼而有之)。您可以在PHP 的数组文档页面和数组函数页面上阅读大量内容。

在 Doctrine 的上下文中(因为它是用 PHP 编写的),这意味着可以以任何你想要的方式对值是实体对象的集合进行排序(当然包括 id),如果你遍历那个集合,你会得到实体对象按原则添加的顺序(SQL/DQL 查询的顺序)。Doctrine 还允许将键设置为实体的 id,同时仍保留 SQL/DQL 查询顺序。这可以简化代码,因为 DoctrineCollection实现了 PHP 的ArrayAccess.

作为一个反例,地图也可以是无序或排序的,其中第一个意味着当您检索对时,顺序可以是随机的(在 golang 中,开始索引在遍历地图时曾经是随机的,不知道这是否是仍然正确)或自动排序(如SortedMap在 Java 中)。

于 2020-04-14T13:57:33.470 回答