Содержание
Благодаря своей мощности и гибкости в работе массивы стали непременным атрибутом PHP . Причем, в ряде сложных ситуаций можно задействовать и двумерные массивы PHP . Данная статья посвящена сортировке многомерных массивов в PHP .
- Многомерный массив;
- Встроенные функции PHP usort () , uasort () или uksort () ;
- Встроенные функции PHP strcasecmp() или strcmp() .
Реализация :
Допустим что, у нас есть массив:
Здесь можно осуществить сортировку двумерного массива PHP по параметру grade ( оценка ) ( числовая сортировка ) или name ( имя ) ( сортировка в алфавитном порядке ).
Внешний массив $students состоит из пяти элементов, каждый из которых также представлен в виде отдельного массива. Внутренний массив использует ID студента в качестве ключа и хранит два значения: имя студента и его оценку.
Для сортировки многомерного массива мы задаем собственную функцию. Говорим PHP , что именно ее нужно использовать для вызова встроенных функций usort () , uasort () или uksort () .
Определяемая функция должна принимать два параметра и возвращать значение, указывающее, какой именно параметр идет первым по списку. Отрицательное или false значение говорит о том, что первый параметр указывается до второго. Положительное или true — что вначале идет второй параметр. Нулевое значение ( 0 ) указывает, что оба параметра равнозначны.
A – Сортировка по оценке (параметр grade) (числовая сортировка)
Определим функцию для сортировки массива по оценке ( параметр grade ):
Затем возьмем пользовательскую функцию и осуществим перебор двумерного массива PHP по первому ключу. Выглядит это примерно так:
Массив отсортирован по оценке
PHP будет отправлять внутренние массивы к этой функции для дальнейшей сортировки. Если вам интересно, как все это происходит в деталях, то выведите на экран результаты сравнения значений внутри функции. А саму функцию после PHP создания двумерного массива измените следующим образом:
Выводя на экран значения $x[‘оценка’] и $y [‘оценка’] , можно увидеть, как вызывается функция сортировки, определенная пользователем.
Можно сократить функцию grade_sort следующим образом:
Результаты сортировки двумерного массива PHP по оценке отображены на картинке ниже:
Примечание : Функция usort () сортирует по значениям, но не сохраняет ключи ( для внешнего массива ). Если ключи нужны, то лучше использовать функцию uasort () .
B – Сортировка по имени (в алфавитном порядке)
Чтобы отсортировать массив $students по первому ключу, необходимо сравнить две строки. Поэтому в примере с сортировкой в алфавитном порядке воспользуемся функция strcasecmp() ( не чувствительна к регистру ) и strcmp() ( чувствительна к регистру ). Получившийся двумерный массив PHP будет иметь следующий вид:
Массив отсортирован по имени
На скриншоте, приведенном ниже, показан результат сортировки по имени:
Данная публикация представляет собой перевод статьи « Sorting multi-dimensional array in PHP » , подготовленной дружной командой проекта Интернет-технологии.ру
В продолжении темы работы с массивами поговорим о типичной задаче – их сортировке. Для ее выполнения в PHP существует множество функций, их подробное описание можно посмотреть на php.net, рассмотрим некоторые примеры.
Сортировка массива по ключу
ksort() и krsort() – сортирует массив по ключу.
Сортировка массива по значению
Функции sort() и rsort() сортирует массив по значению, при этом не сохраняя ключи.
Чтобы сохранить ключи применяется функции asort() и arsort() .
Естественная сортировка
Выше приведенные функции по умолчанию используют алгоритм 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() сортирует массив без учета регистра символов.
Разницу можно увидеть в примере:
У natsort() нет возможности изменить направление сортировки, поэтому можно применить функцию array_reverse() .
Сортировка многомерных массивов
array_multisort() сортирует многомерные массивы по значению, также может отсортировать сразу несколько массивов.
Чтобы изменить направление сортировки вторым аргументом функции указывается SORT_ASC или SORT_DESC .
Сортировка многомерного массива по значению одного ключа
Есть несколько вариантов, первый – uasort() , сортирует массив, используя пользовательскую функцию для сравнения элементов и сохранением ключей.
В примере сортировка идет по ключу « count ».
Второй вариант на основе функции array_multisort() :
Перемешать массив
Функция shuffle() перемешивает массив в случайном порядке.
Даже не знал о новом операторе сравнения в PHP под названием "Космический корабль" (spaceship), который позволяет сортировать многомерный массив по значениям.
Пример сортировки многомерного массива по значению в PHP
Есть многомерный массив $arr с товарами, в котором товары должны сортироваться по значению в индексе num :
[description] => описание телефона
[description] => описание планшета
[description] => описание ноутбука
Вот как это реализовать:
usort($arr, function($a, $b) <
return $a[‘num’] $b[‘num’];
Спасибо буржуНету, в руНете я не наткнулся на ответ, и три года назад городил огород, теперь, имея РЕШЕНИЕ наслаждаюсь жизнью))
Из официальных мануалов:
Оператор spaceship (космический корабль) ¶
Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1 если $a, соответственно, меньше, равно или больше чем $b. Сравнение производится в соответствии с правилами сравнения типов PHP.