Продолжая тему работы с массивами в 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)
Вам также могут понравиться
Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как правильно подключать стили и скрипты к шаблону 1С Битрикс.

Генерация оглавления статьи

Генерация оглавления статьи

В статье рассмотрен пример функции для генерации оглавления статьи блога или новости

Переменные доступные в компоненте 1С Битрикс

Переменные доступные в компоненте 1С Битрикс

В статье разобран список доступных в компоненте 1С Битрикс переменных, позволяющих получить доступ к различным параметрам и методам компонента.


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