Рассматривает ли функция сортировки листовые узлы в многоуровневом массиве? - PullRequest
5 голосов
/ 06 июня 2011

Этот следующий фрагмент кода предназначен для создания многоуровневого массива, его печати, затем перемешивания, повторной печати и сортировки массива.

$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 Ответ

3 голосов
/ 06 июня 2011

См. Раздел массива в справочнике по PHP , особенно в транскрипции сравнения массивов.В основном PHP сначала сравнивает количество ключей в массиве, затем проверяет, имеют ли массивы одинаковые ключи (в данном случае 0 для внутренних массивов), а затем сравнивает значения.Поскольку у вас есть вложенный массив, он начинает сравнивать листовые узлы в sort(), что приводит к сортировке массива в этом случае по первому значению листовых массивов (a, d и g).

shuffle() просто переупорядочивает индексы массива, который вы ему передаете, независимо от того, что содержит массив, таким образом, он вообще не касается внутренних массивов.

...