PHP

Сортировка массивов

В продолжении темы работы с массивами поговорим о типичной задаче – их сортировке. Для ее выполнения в PHP существует множество функций, их подробное описание можно посмотреть на php.net, рассмотрим некоторые примеры.

1

Сортировка массива по ключу

ksort() и krsort() – сортирует массив по ключу.

$array = array(
    3 => 'яблоко',
    1 => 'апельсин',
    5 => 'виноград'
);

// По возрастанию:
ksort($array);
print_r($array);

// По убыванию:
krsort($array);
print_r($array);

Результат:

Array
(
    [1] => апельсин
    [3] => яблоко
    [5] => виноград
)

Array
(
    [5] => виноград
    [3] => яблоко
    [1] => апельсин
)
2

Сортировка массива по значению

Функции sort() и rsort() сортирует массив по значению, при этом не сохраняя ключи.

$array = array(
    3 => 'яблоко',
    1 => 'апельсин',
    5 => 'виноград'
);

// По возрастанию:
sort($array);
print_r($array);

// По убыванию:
rsort($array);
print_r($array);

Результат:

Array
(
    [0] => апельсин
    [1] => виноград
    [2] => яблоко
)

Array
(
    [0] => яблоко
    [1] => виноград
    [2] => апельсин
)

Чтобы сохранить ключи применяется функции asort() и arsort().

$array = array(
    3 => 'яблоко',
    1 => 'апельсин',
    5 => 'виноград'
);

// По возрастанию:
asort($array);
print_r($array);

// По убыванию:
arsort($array);
print_r($array);

Результат:

Array
(
    [1] => апельсин
    [5] => виноград
    [3] => яблоко
)

Array
(
    [3] => яблоко
    [5] => виноград
    [1] => апельсин
)
3

Естественная сортировка

Выше приведенные функции по умолчанию используют алгоритм Quicksort (быстрая сортировка). Чтобы изменить алгоритм нужно вторым аргументом указать флаг:

SORT_REGULAR Обычное сравнение элементов (без изменения типов)
SORT_NUMERIC Числовое сравнение элементов
SORT_STRING Строковое сравнение элементов
SORT_LOCALE_STRING Сравнивает элементы как строки с учетом текущей локали.
SORT_NATURAL Также как natsort()
SORT_FLAG_CASE Может быть объединен с SORT_STRING или SORT_NATURAL для сортировки строк без учета регистра.

Привычную для человека сортировку делают функции natsort(), natcasesort() или флаг SORT_NATURAL
natcasesort() сортирует массив без учета регистра символов.

Разницу можно увидеть в примере:

$array = array(-1, 0, 10, 'текст', 'a', 'b');

// Quicksort:
sort($array);
print_r($array);

// Natural order:
natsort($array);
print_r($array);

Результат:

Array
(
    [0] => -1
    [1] => a
    [2] => b
    [3] => 0
    [4] => текст
    [5] => 10
)

Array
(
    [0] => -1
    [1] => 0
    [2] => 10
    [4] => a
    [5] => b
    [3] => текст
)

У natsort() нет возможности изменить направление сортировки, поэтому можно применить функцию array_reverse().

natsort($array);
$array = array_reverse($array);
print_r($array);

Результат:

Array
(
    [0] => текст
    [1] => b
    [2] => a
    [3] => 10
    [4] => 0
    [5] => -1
)
4

Сортировка многомерных массивов

array_multisort() сортирует многомерные массивы по значению, также может отсортировать сразу несколько массивов.

$array = array(
    array(20, 222, 2, 22),
    array(10, 111, 1, 11),
);

array_multisort($array);
print_r($array);

Результат:

Array
(
    [0] => Array(
        [0] => 10
        [1] => 111
        [2] => 1
        [3] => 11
    )
    [1] => Array(
        [0] => 20
        [1] => 222
        [2] => 2
        [3] => 22
    )
)

Чтобы изменить направление сортировки вторым аргументом функции указывается SORT_ASC или SORT_DESC.

array_multisort($array, SORT_DESC);
print_r($array);

Сортировка многомерного массива по значению одного ключа

Есть несколько вариантов, первый – uasort(), сортирует массив, используя пользовательскую функцию для сравнения элементов и сохранением ключей.

В примере сортировка идет по ключу «count».

$array = array(
    array(
        'sku' => '645908-463',
        'count' => '1'
    ),
    array(
        'sku' => '64590644',
        'count' => '20'
    ),
    array(
        'sku' => '7543',
        'count' => '2'
    )
);

// По возрастанию:
function cmp_function($a, $b){
    return ($a['count'] > $b['count']);
}

uasort($array, 'cmp_function');
print_r($array);

// По убыванию:
function cmp_function_desc($a, $b){
    return ($a['count'] < $b['count']);
}

uasort($array, 'cmp_function_desc');
print_r($array);

Результат:

Array
(
    [0] => Array(
        [sku] => 645908-463
        [count] => 1
    )
    [2] => Array(
        [sku] => 7543
        [count] => 2
    )
    [1] => Array(
        [sku] => 64590644
        [count] => 20
    )
)

Array
(
    [1] => Array(
        [sku] => 64590644
        [count] => 20
    )
    [2] => Array(
        [sku] => 7543
        [count] => 2
    )
    [0] => Array(
        [sku] => 645908-463
        [count] => 1
    )
)

Второй вариант на основе функции array_multisort():

function array_multisort_value()
{
    $args = func_get_args();
    $data = array_shift($args);
    foreach ($args as $n => $field) {
        if (is_string($field)) {
            $tmp = array();
            foreach ($data as $key => $row) {
                $tmp[$key] = $row[$field];
            }
            $args[$n] = $tmp;
        }
    }
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}

$array = array(
    array(
        'sku' => '645908-463',
        'count' => '1'
    ),
    array(
        'sku' => '64590644',
        'count' => '20'
    ),
    array(
        'sku' => '7543',
        'count' => '2'
    )
);

$array = array_multisort_value($array, 'count', SORT_DESC);
print_r($array);
5

Перемешать массив

Функция shuffle() перемешивает массив в случайном порядке.

$array = array(
    3 => 'яблоко',
    1 => 'апельсин',
    5 => 'виноград'
);

shuffle($array);
print_r($array);
17 ноября 2017