Учитывает ли функция сортировки конечные узлы в многоуровневом массиве?

#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() просто переупорядочивает индексы массива, который вы ему предоставляете, независимо от того, что содержит массив, таким образом, он вообще не затрагивает внутренние массивы.