В продолжении темы работы с массивами поговорим о типичной задаче – их сортировке. Для ее выполнения в PHP существует множество функций, их подробное описание можно посмотреть на php.net, рассмотрим некоторые примеры.
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] => апельсин
)
Функции 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] => апельсин
)
Выше приведенные функции по умолчанию используют алгоритм 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()
.
Результат:
Array
(
[0] => текст
[1] => b
[2] => a
[3] => 10
[4] => 0
[5] => -1
)
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
.
Сортировка многомерного массива по значению одного ключа
Есть несколько вариантов, первый – 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);
Функция shuffle()
перемешивает массив в случайном порядке, не сохроняя ключи.
$array = array(
1 => 'яблоко',
2 => 'апельсин',
3 => 'виноград'
);
shuffle($array);
print_r($array);
shuffle($array);
print_r($array);
Результат:
Array
(
[0] => виноград
[1] => яблоко
[2] => апельсин
)
Array
(
[0] => виноград
[1] => апельсин
[2] => яблоко
)
актуальная функция: