Изучаем PHP: сортировка массива
Благодаря своей мощности и гибкости в работе массивы стали непременным атрибутом PHP. Причем, в ряде сложных ситуаций можно задействовать и двумерные массивы PHP. Данная статья посвящена сортировке многомерных массивов в PHP.
Составляющие:
- Многомерный массив;
- Встроенные функции PHP usort (), uasort () или uksort ();
- Встроенные функции PHP strcasecmp() или strcmp().
Реализация:
Допустим что, у нас есть массив:
$students = array (
1 => array ('name' => 'Jack', 'grade' => 98.5),
2 => array ('name' => 'Bill', 'grade' => 90.1),
3 => array ('name' => 'Chloe', 'grade' => 94.0),
4 => array ('name' => 'Taylor', 'grade' => 95.1),
5 => array ('name' => 'Larry', 'grade' => 94.6)
);
Здесь можно осуществить сортировку двумерного массива PHP по параметру grade (оценка) (числовая сортировка) или name (имя) (сортировка в алфавитном порядке).
Внешний массив $students состоит из пяти элементов, каждый из которых также представлен в виде отдельного массива. Внутренний массив использует ID студента в качестве ключа и хранит два значения: имя студента и его оценку.
Для сортировки многомерного массива мы задаем собственную функцию. Говорим PHP, что именно ее нужно использовать для вызова встроенных функций usort (), uasort () или uksort ().
Определяемая функция должна принимать два параметра и возвращать значение, указывающее, какой именно параметр идет первым по списку. Отрицательное или false значение говорит о том, что первый параметр указывается до второго. Положительное или true - что вначале идет второй параметр. Нулевое значение (0) указывает, что оба параметра равнозначны.
A – Сортировка по оценке (параметр grade) (числовая сортировка)
Определим функцию для сортировки массива по оценке (параметр grade):
// Функция сортировки по оценке: сортировка по УБЫВАНИЮ.
function grade_sort($x, $y) {
if ($x[' оценка '] < $y[' оценка ']) {
return true;
} else if ($x['оценка'] > $y['оценка']) {
return false;
} else {
return 0;
}
}
Затем возьмем пользовательскую функцию и осуществим перебор двумерного массива PHP по первому ключу. Выглядит это примерно так:
// $students – наш многомерный массив, а grade_sort – созданная функция
usort ($students, ' grade_sort ');
Пример:
// Вызвать на печать массив в виде (начальный массив):
echo '<h2>Массив в виде</h2><pre>' . print_r($students, 1) . '</pre>';
// Сортировать по оценке (grade):
uasort($students, 'grade_sort');
echo '<h2>Массив отсортирован по оценке</h2><pre>' . print_r($students, 1) . '</pre>';
PHP будет отправлять внутренние массивы к этой функции для дальнейшей сортировки. Если вам интересно, как все это происходит в деталях, то выведите на экран результаты сравнения значений внутри функции. А саму функцию после PHP создания двумерного массива измените следующим образом:
function grade_sort($x, $y) {
static $count = 1;
echo “<p>Iteration $count: {$x[‘оценка’]} vs. {$y[‘оценка’]} </p> n”;
$count++;
if ($x[‘ оценка ‘] < $y[‘ оценка ‘]) {
return true;
} else if ($x[‘ключ1′] > $y[‘ключ1′]) {
return false;
} else {
return 0;
}
}
Выводя на экран значения $x[‘оценка’] и $y [‘оценка’], можно увидеть, как вызывается функция сортировки, определенная пользователем.
Можно сократить функцию grade_sort следующим образом:
// Функция числовой сортировки по оценке: сортировка по УБЫВАНИЮ
function grade_sort($x, $y) {
return ($x['grade'] < $y['grade']);
}
Результаты сортировки двумерного массива PHP по оценке отображены на картинке ниже:

Примечание: Функция usort () сортирует по значениям, но не сохраняет ключи (для внешнего массива). Если ключи нужны, то лучше использовать функцию uasort ().
B – Сортировка по имени (в алфавитном порядке)
Чтобы отсортировать массив $students по первому ключу, необходимо сравнить две строки. Поэтому в примере с сортировкой в алфавитном порядке воспользуемся функция strcasecmp() (не чувствительна к регистру) и strcmp() (чувствительна к регистру). Получившийся двумерный массив PHP будет иметь следующий вид:
// Функция сортировки по имени:
function name_sort($x, $y) {
return strcasecmp($x['имя'], $y['имя']);
}
Пример:
// Вывести на печать массив в виде (начальный массив):
echo '<h2>Массив в виде</h2><pre>' . print_r($students, 1) . '</pre>';
// Сортировка по имени:
uasort($students, 'name_sort');
echo '<h2>Массив отсортирован по имени</h2><pre>' . print_r($students, 1) . '</pre>';
На скриншоте, приведенном ниже, показан результат сортировки по имени:
