PHP. usort() внутри foreach

129
02 декабря 2020, 16:10

Имеется ассоциативный массив массивов объектов. Необходимо отсортировать массивы объектов. Сам ассоциативный массив трогать не надо.

Пример (цифры вместо объектов для упрощения):

$arr['key1'] = [2, 3, 1];
$arr['key2'] = [20, 30, 1];
...

1) Код ниже не меняет порядка элементов в массиве массивов:

foreach ($result as $item) {
    usort($item, function ($a, $b) {
        return $b->value <=> $a->value;
    });
}

Массив объектов $arr['key1'] не поменял порядка элементов.

2) Немного поменяв код:

// foreach ($result as $item) {
    usort($result['key1'], function ($a, $b) {
        return $b->value <=> $a->value;
    });
// }

Объекты в $arr['key1'] отсортированы.

Я не силен в PHP. Возможно есть нюансы в работе foreach и как передаются значения(по ссылке или копируются). Вопрос: Почему так получилось и не работает 1 вариант? Как правильно и "аккуратно" отсортировать массивы внутри ассоциативного массива.

Answer 1

Код ниже не меняет порядка элементов в массиве массивов:

целиком это утверждение корректно. А вот если взять только первую часть

Код ниже не меняет порядка элементов

то она будет ошибочна. можете в цикле сделать print_r($item) и увидите что элементы будут отсортированы.

Суть проблемы в том, что вы сортируете копию каждого элемента основного массива. Возьмите элемент по ссылке, и тогда все будет работать ожидаемо

foreach($result as &$item){
     ...
}
READ ALSO
Не получается сделать downgrade PHP с 7.2 на 5.5 (CentOS 6)

Не получается сделать downgrade PHP с 7.2 на 5.5 (CentOS 6)

не получается понизить версию PHP, вчера обновился до 72, но сегодня решил обратно

138
Вопрос по LibGdx

Вопрос по LibGdx

Пользуюсь автокомплитом в ИдееПо итогу Идея пишет что не может разрешить имя 'newMusic'

136
Как заблокировать все горячие клавиши в окне javafx

Как заблокировать все горячие клавиши в окне javafx

Нужно, чтобы в окне не работали горячие клавиши, кнопка win и тп

107