Использование 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
не копировать переменные, а использовать его по ссылке