Использование usort для сортировки массивов массивов с использованием массивов PHP - PullRequest
0 голосов
/ 04 июля 2011

У меня есть массив массивов с массивами в PHP, и я хочу отсортировать верхний уровень массива на основе поля в каждом элементе, а также хочу отсортировать массив внутри каждого элемента на основе элемента массиваэтого элемента.(см. пример).Я хочу, чтобы в итоге $data сначала имел элемент со значением 'primary' 'first', а затем 'second'.Я также хочу, чтобы внутри '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 Ответ

0 голосов
/ 04 июля 2011

Попробуйте это

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

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

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

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

...