2

Symfony 提供了一个OrderedHashMap. 它的文件指出

与关联数组不同,映射会跟踪添加和删除键的顺序。此顺序反映在迭代过程中。

我对这种说法感到困惑,因为我认为 PHP 关联数组实际上已经是有序映射。我在 SO 上发现了这个问题,这证实了我之前的假设:Are PHP Associative Arraysordered?

我想知道,如果 Symfony 开发人员不知道 PHP 数组已经是有序映射,或者我不了解 Symfony 的角​​色OrderedHashMap

4

2 回答 2

2

当然 PHP 的数组是一个有序映射。

但是 SymfonyOrderedHashMap有一些与 PHP 数组不同的行为(比如features)。

OrderedHashMap支持迭代期间的并发修改。这意味着您可以在foreach循环中插入和删除元素,并且迭代器将相应地反映这些更改。但是array在迭代中是复制的(Copy-On-Write),任何修改都不会反映在循环中。

$map = new OrderedHashMap();
$map[1] = 1;
$map[2] = 2;
$map[3] = 3;

foreach ($map as $index => $value) {
    echo "$index: $value\n"
    if (1 === $index) {
        $map[1] = 4;
        $map[] = 5;
    }
}

如果您使用array. 在循环的迭代中array不会看到数字5

关于“ Why? ”:在Symfony 的代码库中搜索。只有一个地方可以使用OrderedHashMap,用于存储表单的子项。它用于new InheritDataAwareIterator($this->children)迭代。所以我认为答案是帮助处理表单的孩子。

感谢@fishbone:

所以好处不是排序,而是循环修改它的能力。

于 2018-03-23T09:15:27.413 回答
0

一般来说,不仅在 Symfony 的上下文中,除了附加实现的特性之外,面向对象的结构比原始类型(如)更受欢迎intstring或者array因为它们可以注入到类中进行单元测试。

面向对象的结构也可以强制执行不变量,而原始类型只能保存没有任何行为的数据。

于 2018-03-23T09:21:08.080 回答