Продолжая тему работы с массивами в php, давайте более подробно раскроем подходы к их сортировке. Для выполнения сортировки в PHP предусмотрен набор специальных функций, давайте рассмотрим наиболее распространённые случаи.

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

Функции ksort() и krsort() сортируют массивы по ключу, в порядке возрастания ключа и убывания соответственно.

$arr = [
	2 => 'Январь',
	1 => 'Февраль',
	3 => 'Март',
];

//Сортировка по возрастанию
ksort($arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

Результат:

Array
(
    [1] => Февраль
    [2] => Январь
    [3] => Март
)

И в обратном порядке
$arr = [
	2 => 'Январь',
	1 => 'Февраль',
	3 => 'Март',
];

//Сортировка по убыванию
krsort($arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

Результат:

Array
(
    [3] => Март
    [2] => Январь
    [1] => Февраль
)

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

Аналогично сортировке по ключам, вы можете отсортировать одномерный массив по значению используя функции sort() и rsort() сортировка так же идёт по возрастанию и убыванию значения (или в алфавитном порядке). При использовании этих функций, ключи не сохранятся.


$arr = [1, 3, 5, 0, 22, 17, 4, 6, 9];

//Сортировка по возрастанию
sort($arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

Результат:

Array
(
    [0] => 0
    [1] => 1
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 9
    [7] => 17
    [8] => 22
)

И для строковых значений


$arr = ['Валера', 'Светлана', 'Борис', 'Александр'];

//Сортировка по возрастанию
sort($arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

Результат:

Array
(
    [0] => Александр
    [1] => Борис
    [2] => Валера
    [3] => Светлана
)

Если вам нужно сохранить ключи, при сортировке по значению, используйте asort() и arsort().

$arr = [
	'manager' => 'Валера', 
	'marketing_specialist' => 'Светлана', 
	'accountant' => 'Борис', 
	'programmer' => 'Александр'
];

//Сортировка по возрастанию
asort($arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

Результат:

Array
(
    [programmer] => Александр
    [accountant] => Борис
    [manager] => Валера
    [marketing_specialist] => Светлана
)
Существует так же возможность отсортировать массив, используя свой алгоритм сравнения элементов в процессе сортировки. Для этого нам потребуется функция usort(), она принимает массив и имя callback-функции которая будет вызвана для каждого сравнения элементов.


//Функция сравнения, тут сортируем по чётным и не чётным элементам
function compare($a, $b)
{
    if ($a == $b) {
        return 0;
    }
	
	$ares = $a % 2;
	$bres = $b % 2;
	
    return ($ares < $bres) ? -1 : 1;
}

//Заданный массив с числами
$numbers = [3, 2, 5, 6, 1, 9, 12, 8, 10];

//Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения
usort($numbers, 'compare');

echo '<pre>';
print_r($numbers);
echo '</pre>';


Результат:

Array
(
    [0] => 8
    [1] => 10
    [2] => 6
    [3] => 12
    [4] => 2
    [5] => 9
    [6] => 1
    [7] => 5
    [8] => 3
)

Как видите чётные элементы идут вначале. Алгоритм функции compare() может быть любым, под ваши задачи. Вы так же можете пробросить в тело функции compare() внешнюю переменную используя анонимную функцию и ключевое слово use:


$params = ['min_value'=>0, 'max_value'=>3];
function compare($params){
    return function ($a, $b) use ($params)
    {
        if ($a == $b) {
            return 0;
        }

        if($a < $b && $a >= $params['min_value'] && $a <= $params['max_value']){
            return -1;
        } else {
            return 1;
        }
    };
}


//Заданный массив с числами идущими не по порядку
$numbers = [3, 2, 5, 6, 1];

//Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения
usort($numbers, compare($params));

Результат:

Аrray(5) {
  [0]=>int(1)
  [1]=>int(2)
  [2]=>int(3)
  [3]=>int(6)
  [4]=>int(5)
}


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

У вышеописанных функций сортировки есть дополнительные возможности, позволяющих поменять алгоритм сортировки, сделав её более естественно для человека. Для этого в функции sort(), rsort(), asort(), arsort() можно передать второй параметр, который поменяет поведение функции. Доступные параметры:
  • SORT_REGULAR - обычное сравнение элементов
  • SORT_NUMERIC - числовое сравнение элементов
  • SORT_STRING - строковое сравнение элементов
  • SORT_LOCALE_STRING - сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL - сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE - можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

$arr = [-1, 0, 10, 2, 5, 'текст', 'a', 'b', true];

//Обычная сортировка по значению
sort($arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

echo '-------------------<br/>';

sort($arr, SORT_NATURAL);

echo '<pre>';
print_r($arr);
echo '</pre>';

Результат:

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

Согласитесь, второй вариант более "человечный".

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

Функция array_multisort() сортирует несколько массивов или многомерные массивы по значению. Принимает в качестве параметра массив и флаг направления сортировка SORT_ASC или SORT_DESC.


$arr = [
	[6, 5, 8, 48, 58, 65, 123],
	[1, 150, 2, 3, 80, 33, 22]
];

array_multisort($arr);

echo '<pre>';
print_r($arr);
echo '</pre>';

Результат:


Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 150
            [2] => 2
            [3] => 3
            [4] => 80
            [5] => 33
            [6] => 22
        )

    [1] => Array
        (
            [0] => 6
            [1] => 5
            [2] => 8
            [3] => 48
            [4] => 58
            [5] => 65
            [6] => 123
        )

)

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

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

//Функция сравнения по ключу price
function compare($a, $b){
	if ($a['price'] == $b['price']) {
			return 0;
	}
	
	return ($a['price'] < $b['price']) ? -1 : 1;
	
}

//Массив товаров
$products = [

	[
		'id' => 1,
		'name' => 'Товар 1',
		'price' => 15,
		'quantity' => 10 
	],
	[
		'id' => 2,
		'name' => 'Товар 2',
		'price' => 100,
		'quantity' => 8 
	],
	[
		'id' => 3,
		'name' => 'Товар 3',
		'price' => 75,
		'quantity' => 12 
	],
	[
		'id' => 4,
		'name' => 'Товар 4',
		'price' => 100,
		'quantity' => 25 
	],
];

//Сортируем по цене
uasort($products, 'compare');

echo '<pre>';
print_r($products);
echo '</pre>';

Результат

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Товар 1
            [price] => 15
            [quantity] => 10
        )

    [2] => Array
        (
            [id] => 3
            [name] => Товар 3
            [price] => 75
            [quantity] => 12
        )

    [1] => Array
        (
            [id] => 2
            [name] => Товар 2
            [price] => 100
            [quantity] => 8
        )

    [3] => Array
        (
            [id] => 4
            [name] => Товар 4
            [price] => 100
            [quantity] => 25
        )

)

В итоге получаем отсортированный по возрастанию цены список товаров.

Полезная статья?
(Голосов: 1, Рейтинг: 3.3)
Курсы от партнёров
Хотите освоить востребованную профессию? Воспользуйтесь предложениями от наших партнёров. Пройдите учебный курс по одному из популярных IT направлений.

Все курсы партёнров
Вам также могут понравиться
CSS курсоры

CSS курсоры

В статье рассмотрены возможности изменения курсоров пользователя при помощи CSS

Работа с регистром строк в php

Работа с регистром строк в php

В статье рассмотрены примеры работы с регистром строк в языке PHP, проверка регистра, изменение, инверсия

Работа с циклами в PHP

Работа с циклами в PHP

В статье рассмотрены примеры работы с циклами в PHP


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке