Почему я не могу численно отсортировать вложенный массив?

#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. Не забудьте отметить вопрос как решение, чтобы Феликс получил свои очки репутации … 🙂