Почему Symfony предоставляет OrderedHashMap

Symfony предоставляет OrderedHashMap. Его в документации говорится

Unlike associative arrays, the map keeps track of the order in which keys were added and removed. This order is reflected during iteration.

Меня смущает это утверждение, потому что я думал, что ассоциативные массивы PHP на самом деле уже упорядоченные карты. Я нашел этот вопрос на SO, который подтверждает мое предыдущее предположение: Упорядочены ли ассоциативные массивы PHP?

Интересно, если разработчики Symfony не знали, что массивы PHP уже являются упорядоченными картами, или я не понимаю роль OrderedHashMap Symfony

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
298
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Конечно, массив PHP - это упорядоченная карта.

Но OrderedHashMap Symfony ведет себя несколько иначе (скажем, Особенности) по сравнению с массивом PHP.

OrderedHashMap поддерживает одновременную модификацию во время итерации. Это означает, что вы можете вставлять и удалять элементы из цикла foreach, и итератор соответствующим образом отразит эти изменения. Но array в итерации - это скопированный (Копирование при записи), любая модификация в цикле не отражается.

$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.

О "Почему?": ищите в Кодовая база Symfony. Есть только место один для использования OrderedHashMap, который используется для хранения дочерних элементов формы. Он используется new InheritDataAwareIterator($this->children) для итерации. Поэтому я думаю, что ответ - помочь обработать дочерние элементы формы.

И благодаря @fishbone:

So the benefit is not the ordering but the ability to modify it in loops.

Это не объясняет, почему говорят, что ассоциативные массивы не отслеживают порядок. Таким образом, преимущество заключается не в упорядочивании, а в возможности изменять его в циклах.

fishbone 23.03.2018 10:32

В общем, не только в контексте Symfony, помимо дополнительных реализованных функций, объектно-ориентированные структуры предпочтительнее примитивных типов, таких как int, string или array, поскольку они могут быть введены в класс для модульного тестирования.

Объектно-ориентированные структуры также могут обеспечивать соблюдение инвариантов, тогда как примитивные типы могут содержать только данные без какого-либо поведения.

Это неправда, потому что массив php реализован методом копирования при записи. Передача массивов так же легка, как и прохождение объектов.

shawn 23.03.2018 10:29

Поэтому попробуйте изменить и вернуть этот массив из 10 разных мест.

emix 23.03.2018 10:30

Пожалуйста, посмотрите мой комментарий к ответу Шона

fishbone 23.03.2018 10:33

В кодовой базе Symfony есть лишь несколько вариантов использования OrderedHashMap: github.com/symfony/form/…children уже является private, нет возможности вызвать COW в разных местах.

shawn 23.03.2018 10:34

Как в реальном мире передавать аргумент и ничего не делать с ним?

emix 23.03.2018 10:50

Чтение массива не вызывает COW. Передача аргумента и его чтение - очень распространенное явление.

shawn 23.03.2018 11:00

Другие вопросы по теме