PHP usort внутри foreach в алфавитном порядке

Я пытаюсь понять, почему мой код не работает так, как я ожидаю. У меня есть массив:

$persons = array(
    0 => array(
        'person' => 'John',
        'children' => array('Eve', 'Mark', 'Alto')
    ),
    1 => array(
        'person' => 'Susy',
        'children' => array('Ruby', 'Adam', 'Tõnu')
    )
);

Зациклить массив и отсортировать детей по алфавиту

foreach( $persons as $person ) {

    usort($person['children'], function( $a, $b ) {
        return strcmp( $a, $b );
    });
    var_dump($person['children']); //shows children array items alphabetically ordered

}

Но после foreach дети все еще находятся в начальном порядке

var_dump($persons); //shows that children names are not ordered alphabetically

Спасибо за ваше время


person EstSiim    schedule 31.01.2017    source источник


Ответы (1)


Цикл foreach создает то, что фактически является копией значения массива внутри цикла. Копия сортируется, но не изменяет исходный массив. Для этого вы можете сделать его ссылкой с помощью &:

foreach ($persons as &$person) {

Из документации:

На каждой итерации значение текущего элемента присваивается $value, а внутренний указатель массива сдвигается на единицу... Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед $value ставится знак &. В этом случае значение будет присвоено по ссылке.

Другой способ напрямую ссылаться на массивы — перебирать индексы и ссылаться на элементы:

for ($i = 0; $i < count($persons); $i++) {
    usort($persons[$i]['children']), function($a, $b) {
        return strcmp($a, $b);
    });
}
person Matt S    schedule 31.01.2017