Вы находитесь на странице: 1из 6

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 31. СТАНДАРТНЫЕ ФУНКЦИИ. МАССИВЫ. СОРТИРОВКИ.

С этого урока Вы перейдете к изучению стандартных функций,


предназначенных для работы с массивами данных. О том, что такое массивы, Вы
уже узнали из более ранних уроков и теперь стоит разобраться с наиболее частыми
операциями над ними, осуществляемыми через функции PHP.
Одной из самых частых задач перед разработчиками ставится сортировка
данных, помещенных в массив.
Стоит заметить, что ранее, в уроках, посвященных стандартным строковым
функциям, уже рассматривались вопросы сортировки. В частности, упоминалось
такое понятие, как лексикографическая сортировка.
Перед тем, как перейти к функциям сортировки массивов стоит условиться в
понятиях, чем отличается лексикографическая, числовая и естественная
сортировка.
А) числовая сортировка – сортировка данных, основанная на
последовательности чисел. Может принимать различные формы, основными из
которых, является возрастающая и убывающая последовательность. Примером
такой сортировки может быть следующий пример:
- первоначальный набор чисел: 1, 5, 3, 9;
- отсортированный по возрастанию набор: 1, 3, 5, 9;
- отсортированная по убыванию набор: 9, 5, 3, 1.
Б) Лексикографическая сортировка – сортировка данных, основанная на
последовательности символов в алфавите. При этом стоит заметить, что при
наличии двух и более алфавитов, очередность сортировки будет зависеть от кода
символа. Так, последовательность символов «a, g, A, k, b, Z» может выглядеть так:
- сортировка по возрастанию: A, Z, a, b, g, k;
- сортировка по убыванию: k, g, b, a, Z, A.
А последовательность чисел 1, 2, 4, 20, 40 будет выглядеть так:
- сортировка по возрастанию: 1, 2, 20, 4, 40;
- сортировка по убыванию: 40, 4, 20, 2, 1.
В) Естественная сортировка – сортировка, учитывающая алгоритмы и
числовой, и лексикографической. Так как элементы набора могут принимать тип,
состоящий как из числовых, так и других символов, при сортировке стоит учитывать
их порядок исходя из «естественного» положения вещей. Так, для набора
элементов «v1, v10, v2, v12, v40» естественная сортировка будет принимать
следующий вид:
- по возрастанию: v1, v2, v10, v12, v40;
- по убыванию: v40, v12, v10, v2, v1.
Таким образом, даже при наличии символа «v» в начале элемента,
естественная сортировка определяет, что сортировать надо и с учетом числовой
последовательности.
Далее, во всех представленных функциях будет использоваться параметр
$sort_flag, который позволяет настроить алгоритм сортировки в соответствии с
потребностями разработчика. Может принимать следующие значения:
- SORT_REGULAR – автоматический выбор, установлен по умолчанию;
- SORT_NUMERIC – числовая сортировка;
- SORT_STRING – лексикографическая сортировка.
Перейдем непосредственно к функциям сортировки массивов.

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Сортировка ассоциативных массивов по значениям


В связи с тем, что в ассоциативных массивах данные хранятся в парах ключ =>
значение, необходимо разделять сортировку элементов по ключу и по значению.
Порой ключ для элемента является лишь способом быстрого доступа к нему, а
задача стоит упорядочить элементы в лексикографическом порядке.
Для этого в PHP существуют функции:
void asort(array &$array [, int $sort_flag]) – сортировка по возрастанию (как
числовому, так и алфавитному);
void arsort(array &$array [, int $sort_flag]) – сортировка по убыванию (аналогично
asort().
Данные функции сортируют ассоциативный массив по значениям, сохраняя
связи значений с ключами.
В данных функциях используются следующие параметры:
- &$array – ассоциативный массив данных, которые необходимо
отсортировать;
- $sort_flag – параметры сортировки.
Рассмотрим принципы работы этих функций в листинге 31.1
Листинг 31.1. Функции asort() и arsort()

//Создадим ассоциативный массив


$names = [
'a' => 'Алексей',
'b' => 'Михаил',
'c' => 'Пётр',
'd' => 'Владимир',
'e' => 'Сергей',
'f' => 'Роман'
];

//Отсортируем массив в прямом порядке и выведем результат на экран


asort($names);
echo "<b>Имена в прямой последовательности</b>";
foreach($names as $k => $v)
echo "<p> $k => $v</p>";

//Отсортируем массив в обратном порядке и выведем результат на экран


arsort($names);
echo "<b>Имена в обратной последовательности</b>";
foreach($names as $k => $v)
echo "<p> $k => $v</p>";

Как видно из результатов вывода на экран, сортировка расположила элементы


в новом порядке, сохранив при этом связи между парами ключ => значение.

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Сортировка ассоциативных массивов по ключам


Аналогично сортировке по значениям, возможна сортировка ассоциативных
массивов по ключам с сохранением связей ключ => значение. Для этого
предназначены функции:
void ksort(array &$array [, int $sort_flag])
void krsort(array &$array [, int $sort_flag])
Функции аналогичны asort() и arsort() с той разницей, что используют для
сортировки ключи.
Пример работы этих функций показан в листинге 31.2.
Листинг 31.2. Функции ksort() и krsort()

//Создадим ассоциативный массив


$names = [
'a' => 'Алексей',
'b' => 'Михаил',
'c' => 'Пётр',
'd' => 'Владимир',
'e' => 'Сергей',
'f' => 'Роман'
];

//Отсортируем массив в прямом порядке и выведем результат на экран


ksort($names);
echo "<b>Имена в прямой последовательности</b>";
foreach($names as $k => $v)
echo "<p> $k => $v</p>";

//Отсортируем массив в обратном порядке и выведем результат на экран


krsort($names);
echo "<b>Имена в обратной последовательности</b>";
foreach($names as $k => $v)
echo "<p> $k => $v</p>";

Естественная сортировка
В случаях, когда элементы массива содержат в себе смешанные типы,
например строки, содержащие числа, сортировка asort() не подойдет, т. к.
воспримет элементы как строки и станет сортировать в лексикографическом
порядке.
Для этих случаев предусмотрены функции естественной сортировки:
void natsort(array &$array)
void natcasesort(array &$array)
Различие между этими функциями в том, что natcasesort() не учитывает регистр
символов в элементах массива.
Листинг 31.3. Функции natsort() и natcasesort()

$file_names = [
'a' => 'fILe125',

3
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

'b' => 'Img138',


'c' => 'catalog23',
'd' => 'Doc45',
'e' => 'script57',
'f' => 'vIDEo48'
];

//Отсортируем массив с учетом регистра и выведем результат на экран


natsort($file_names);
echo "<b>Массив в прямом порядке с учетом регистра символов:</b>";
foreach($file_names as $k => $v)
echo "<p> $k => $v</p>";

//Отсортируем массив без учета регистра и выведем на экран


natcasesort($file_names);
echo "<b>Массив в прямом порядке с без учета регистра символов:</b>";
foreach($file_names as $k => $v)
echo "<p> $k => $v</p>";

Сортировка массивов-списков
Массивы, в которых пары ключ => значение принимаются в виде:
- ключи принимают значения от 0 до N, где N – количество элементов в
массиве – 1;
- значения присваиваются ключам в порядке их добавления в массив,
т. е. массивы-списки, могут быть отсортированы с разрушением зависимостей
между ключами и значениями с помощью функций sort() и rsort().
Кроме того, если в такую функцию в качестве массива для сортировки
добавить ассоциативный массив, он будет воспринят как список.
void sort(array &$array [, int $sort_flag])
void rsort(array &$array [, int $sort_flag])
Рассмотрим, как функции работают с массивами-списками и ассоциативными
массивами в листинге 31.4.
Листинг 31.4. Функции sort() и rsort()

/Создадим ассоциативный массив и массив-список


$names = [
'a' => 'Алексей',
'b' => 'Михаил',
'c' => 'Пётр',
'd' => 'Владимир',
'e' => 'Сергей',
'f' => 'Роман'
];

$cars = ['Ferrari', 'Bentley', 'Lamborghini', 'Porsche', 'Rolls Royce'];

//Выведем массивы на экран

4
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

echo "<b>Ассоциативный массив:</b>";


foreach($names as $k => $v)
echo "<p>[{$k}] => '$v'</p>";

echo "<b>Массив-список:</b>";
foreach($cars as $k => $v)
echo "<p>[{$k}] => '$v'</p>";

//Произведем сортировку массивов функцией sort()


sort($names);
sort($cars);

//Выведем на экран массивы


echo "<b>Отсортированный ассоциативный массив:</b>";
foreach($names as $k => $v)
echo "<p>[{$k}] => '$v'</p>";

echo "<b>Отсортированный массив-список:</b>";


foreach($cars as $k => $v)
echo "<p>[{$k}] => '$v'</p>";

При выводе результатов на экран Вы увидите, что у обоих массивов


разрушены связи ключей и значений и оба массива приведены к виду массива-
списка.

Перемешивание списка
PHP позволяет производить случайное перемешивание массивов-списков.
Кроме того, если в эту функцию вложить ассоциативный массив, то он будет
воспринят как массив-список и затем будет перемешан.
Эта функция – void shuffle(array &$array)
Листинг 31.5. Перемешивание массива функцией shuffle()

//Создаем массив-список
$fruits = ['Яблоки', 'Вишня', 'Сливы', 'Бананы', 'Груши'];

//Выводим его на экран


echo "<b>Первоначальный порядок элементов:</b>";
foreach($fruits as $v)
echo "<p>{$v};</p>";

//Производим перемешивание
shuffle($fruits);

//Выводим на экран новый порядок элементов


echo "<b>Новый порядок элементов:</b>";
foreach($fruits as $v)
echo "<p>{$v};</p>";

5
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

При обновлении страницы, функция будет выдавать разные варианты


сортировки элементов массива-списка.