#php #sorting #multidimensional-array
#php #сортировка #многомерный массив
Вопрос:
У меня есть 2D-массив, который выглядит следующим образом:
array(2) {
[45]=>
array(5) {
[0]=>
int(2)
[1]=>
int(5)
[2]=>
int(1)
[3]=>
int(3)
[4]=>
int(4)
}
[42]=>
array(5) {
[0]=>
int(5)
[1]=>
int(4)
[2]=>
int(3)
[3]=>
int(2)
[4]=>
int(1)
}
}
Ключевые значения внешнего массива являются числовыми, но не начинаются с 0 и не являются последовательными. Я хочу отсортировать внешний массив по возрастанию ключей, а внутренние массивы по возрастанию значений, поэтому я пытаюсь это:
ksort($arr);
foreach ($arr as $a) {
sort($a);
}
var_dump($arr);
Который сортирует внешний массив, как ожидалось, но, похоже, вообще не затрагивает внутренние массивы:
array(2) {
[42]=>
array(5) {
[0]=>
int(5)
[1]=>
int(4)
[2]=>
int(3)
[3]=>
int(2)
[4]=>
int(1)
}
[45]=>
array(5) {
[0]=>
int(2)
[1]=>
int(5)
[2]=>
int(1)
[3]=>
int(3)
[4]=>
int(4)
}
}
Почему это так, и как я могу достичь того, чего я хочу? Я думаю, это как-то связано с вложенностью массива, потому что следующее работает так, как ожидалось:
$test = array(5,2,3,1,4);
sort($test);
var_dump($test);
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
Ответ №1:
foreach
выполняет итерацию по копии массива. Если вы хотите изменить фактические значения, вы должны ссылаться на них:
// v
foreach ($arr as amp;$a) {
sort($a);
}
unset($a);
Из документации:
Начиная с PHP 5, вы можете легко изменять элементы массива, добавляя перед значением $value amp; . Это позволит назначить ссылку вместо копирования значения.
Комментарии:
1. Не забудьте отметить вопрос как решение, чтобы Феликс получил свои очки репутации … 🙂