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 - это упорядоченная карта.
Но 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.
В общем, не только в контексте Symfony, помимо дополнительных реализованных функций, объектно-ориентированные структуры предпочтительнее примитивных типов, таких как int, string или array, поскольку они могут быть введены в класс для модульного тестирования.
Объектно-ориентированные структуры также могут обеспечивать соблюдение инвариантов, тогда как примитивные типы могут содержать только данные без какого-либо поведения.
Это неправда, потому что массив php реализован методом копирования при записи. Передача массивов так же легка, как и прохождение объектов.
Поэтому попробуйте изменить и вернуть этот массив из 10 разных мест.
Пожалуйста, посмотрите мой комментарий к ответу Шона
В кодовой базе Symfony есть лишь несколько вариантов использования OrderedHashMap: github.com/symfony/form/…children уже является private, нет возможности вызвать COW в разных местах.
Как в реальном мире передавать аргумент и ничего не делать с ним?
Чтение массива не вызывает COW. Передача аргумента и его чтение - очень распространенное явление.
Это не объясняет, почему говорят, что ассоциативные массивы не отслеживают порядок. Таким образом, преимущество заключается не в упорядочивании, а в возможности изменять его в циклах.