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

Благодаря своей мощности и гибкости в работе массивы стали непременным атрибутом 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 создания двумерного массива измените следующим образом:

Читайте также:  Asus gt 640 драйвер

Выводя на экран значения $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.

Rate this post

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *