#php #sorting #shuffle
#php #сортировка #перемешивание
Вопрос:
Следующий фрагмент кода предназначен для создания многоуровневого массива, его печати, затем перетасовки, повторной печати и сортировки массива.
$arr=array(
array(
array('a','b','c')
),
array(
array('d','e','f')
),
array(
array('g','h','i')
),
);
print_r($arr);
shuffle($arr);
print_r($arr);
sort($arr);
print_r($arr);
Теперь странная вещь, которую я заметил, когда shuffle()
используется, она только перетасовывает индексы массива, который перетасовывается, она не перетасовывает большинство внутренних элементов a,b,c
во что-то другое, но когда используется sort()
функция, она возвращает массиву нормальное состояние, и конечные узлы возвращаются в алфавитный порядок. Почему это происходит?
Вот пример вывода: *Исходный массив*
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
[1] => Array
(
[0] => Array
(
[0] => d
[1] => e
[2] => f
)
)
[2] => Array
(
[0] => Array
(
[0] => g
[1] => h
[2] => i
)
)
)
Перетасованный массив
Array
(
[0] => Array
(
[0] => Array
(
[0] => g
[1] => h
[2] => i
)
)
[1] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
[2] => Array
(
[0] => Array
(
[0] => d
[1] => e
[2] => f
)
)
)
Отсортированный массив
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
[1] => Array
(
[0] => Array
(
[0] => d
[1] => e
[2] => f
)
)
[2] => Array
(
[0] => Array
(
[0] => g
[1] => h
[2] => i
)
)
)
Ответ №1:
Смотрите раздел array в справочнике по операторам сравнения PHP, особенно транскрипцию сравнения массивов. По сути, PHP сначала сравнивает количество ключей в массиве, затем проверяет, имеют ли массивы одинаковые ключи (в данном случае, 0
для внутренних массивов), а затем сравнивает значения. Поскольку у вас там есть вложенный массив, она продолжает сравнивать конечные узлы в sort()
, что приводит к сортировке массива в данном случае по первому значению конечных массивов ( a
, d
и g
).
shuffle()
просто переупорядочивает индексы массива, который вы ему предоставляете, независимо от того, что содержит массив, таким образом, он вообще не затрагивает внутренние массивы.