Использование usort для сортировки массивов массивов с использованием массивов PHP

У меня есть массив массивов с массивами в PHP, и я хочу отсортировать верхний уровень массива на основе поля в каждом элементе, и я также хочу отсортировать массив внутри каждого элемента на основе элемента массива этого элемента, (см. пример). Я хочу, чтобы в конце концов, $data имеет первый элемент с 'primary' значение "первый", затем "второй". Я также хочу, чтобы внутри 'first' и 'second' массив под полем 'secondary' имеет первый элемент с 'val' из 'foo' затем 'bar' (как для 'first', так и для 'second')

$data = array (
    array (
        'myid'      => 4,
        'primary'   => 'second',
        'secondary' => array (
            array (
                'myid' => 10,
                'val'  => 'bar',
            ),
            array (
                'myid' => 8,
                'val'  => 'foo',
            ),
        ),
    ),
    array (
        'myid'      => 2,
        'primary'   => 'first',
        'secondary' => array (
            array (
                'myid' => 10,
                'val'  => 'bar',
            ),
            array (
                'myid' => 8,
                'val'  => 'foo',
            ),
        ),
    ),
);

function mysort($a, $b) {
    return $a['myid'] > $b['myid'];
}

echo "pre sort:\n";
print_r($data);

usort($data, 'mysort');

echo "post top level sort:\n";
print_r($data);

foreach ($data as $k=>$item) {
    usort($item['secondary'], 'mysort');
    echo "Second Level Item sort:\n";
    print_r($item['secondary']);
}

echo "post second level sort:\n";
print_r($data);

Почему я получаю следующий окончательный результат?

post second level sort:
Array
(
    [0] => Array
        (
            [myid] => 2
            [primary] => first
            [secondary] => Array
                (
                    [0] => Array
                        (
                            [myid] => 10
                            [val] => bar
                        )

                    [1] => Array
                        (
                            [myid] => 8
                            [val] => foo
                        )

                )

        )

    [1] => Array
        (
            [myid] => 4
            [primary] => second
            [secondary] => Array
                (
                    [0] => Array
                        (
                            [myid] => 10
                            [val] => bar
                        )

                    [1] => Array
                        (
                            [myid] => 8
                            [val] => foo
                        )

                )

        )

)

Кстати, я использую PHP 5.2.17.

1 ответ

Решение

Попробуй это

foreach ($data as $k=>&$item) {
    usort($item['secondary'], 'mysort');
    echo "Second Level Item sort:\n";
    print_r($item['secondary']);
}

Почему это так?

Потому что по умолчанию foreach скопируйте все переменные в нем.
Так что если вы измените переменную в foreach вы меняете только локальную переменную, а после foreach это конец, переменная будет так же, как и раньше foreach

Когда вы добавляете & - чем foreach не копировать переменные, а использовать его по ссылке

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