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

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

1

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

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

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

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

Результат:

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);
PHP

Результат:

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);
PHP

Результат:

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);
PHP

Результат:

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);
PHP

Результат:

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);
PHP

Результат:

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);
PHP

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

Есть несколько вариантов, первый – 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);
PHP

Результат:

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);
PHP
5

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

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

shuffle($array);
print_r($array);

shuffle($array);
print_r($array);
PHP

Результат:

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

Комментарии 3

Андрей Перминов Андрей Перминов
20 декабря 2023 в 11:52
В 4-ом примере порядок чисел в массиве не изменился. Т.е. пример нерабочий?
Кларк Кент Кларк Кент
29 января 2024 в 11:05
А если ключ и значение число? (Ну или ключ может быть число) Пробовал несколько способов, в начале ставит числовые ключи независимо от значения.
Garsio Garsio
3 октября 2024 в 21:52
При сортировке многомерного массива по ключу в PHP 8.0 получаем - uasort(): Returning bool from comparison function is deprecated, return an integer less than, equal to, or greater than zero in ....
актуальная функция:
function cmp_function($a, $b){											return $a['timestamp'] <=> $b['timestamp'];
}

, чтобы добавить комментарий.

Другие публикации

Пример парсинга html-страницы на phpQuery
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
68295
+27
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
20707
+2
Поиск файлов в PHP
Для поиска файлов на сервере хорошо подходит функция glob(), которая возвращает список файлов по заданной маске, например...
26619
+1
Как вывести PHP массив
Примеры использования PHP функций и циклов для вывода всех элементов массива в окно браузера.
99239
+6
Преобразование цветов в PHP
Несколько примеров как перевести цвета из HEX в RGB и обратно с помощью PHP.
16980
-1
Генерация паролей в PHP
В PHP есть несколько функций для генерации случайного числа, это rand(), mt_rand() и random_int().
25003
+11