0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>17 июн 2022</li>
2
<ul><li>17 июн 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Становимся настоящими ниндзя в сортировке массивов. Вместо оружия - встроенные функции PHP, быстрые и точные, как катана.</p>
4
</ul><p>Становимся настоящими ниндзя в сортировке массивов. Вместо оружия - встроенные функции PHP, быстрые и точные, как катана.</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
6
<p>В PHP массивом называют структуру данных, которая позволяет хранить упорядоченный набор значений по принципу ключ => значение. И количество инструментов для работы с массивами тут впечатляет: для одной только сортировки существует 13 встроенных функций! В этой статье мы покажем, как ими пользоваться, чтобы получать информацию в нужном виде.</p>
6
<p>В PHP массивом называют структуру данных, которая позволяет хранить упорядоченный набор значений по принципу ключ => значение. И количество инструментов для работы с массивами тут впечатляет: для одной только сортировки существует 13 встроенных функций! В этой статье мы покажем, как ими пользоваться, чтобы получать информацию в нужном виде.</p>
7
<p>Все функции PHP для сортировки массивов "конструируются" из четырёх основных критериев:</p>
7
<p>Все функции PHP для сортировки массивов "конструируются" из четырёх основных критериев:</p>
8
<ul><li>вид сортировки - по ключу или значениям;</li>
8
<ul><li>вид сортировки - по ключу или значениям;</li>
9
<li>порядок сортировки - восходящий, нисходящий, естественный, пользовательский и прочие;</li>
9
<li>порядок сортировки - восходящий, нисходящий, естественный, пользовательский и прочие;</li>
10
<li>способ обработки ключей - с сохранением связи или нет;</li>
10
<li>способ обработки ключей - с сохранением связи или нет;</li>
11
<li>наличие уточняющих опций - в семи из этих функций можно указать предпочтительный способ сортировки и дополнительные параметры ("флаги").</li>
11
<li>наличие уточняющих опций - в семи из этих функций можно указать предпочтительный способ сортировки и дополнительные параметры ("флаги").</li>
12
</ul><p>Вот функции, которые позволяют это сделать:</p>
12
</ul><p>Вот функции, которые позволяют это сделать:</p>
13
Список функций сортировки массивов в PHP<em>Изображение: Евгений Колесников для Skillbox Media</em><p>У каждой из функций есть название, указывающее на вид сортировки и завершающееся круглыми скобками. Эти названия на первый взгляд кажутся не особо говорящими, поэтому для начала лучше выбирать функцию под конкретную задачу, сверяясь с табличкой на официальном сайте. При этом легко запомнить, что функции с буквой "k" сортируют массивы по ключам.</p>
13
Список функций сортировки массивов в PHP<em>Изображение: Евгений Колесников для Skillbox Media</em><p>У каждой из функций есть название, указывающее на вид сортировки и завершающееся круглыми скобками. Эти названия на первый взгляд кажутся не особо говорящими, поэтому для начала лучше выбирать функцию под конкретную задачу, сверяясь с табличкой на официальном сайте. При этом легко запомнить, что функции с буквой "k" сортируют массивы по ключам.</p>
14
<p>В зависимости от выбранной функции внутри скобок указывается массив или несколько массивов для сортировки, а затем могут идти опции (флаги):</p>
14
<p>В зависимости от выбранной функции внутри скобок указывается массив или несколько массивов для сортировки, а затем могут идти опции (флаги):</p>
15
<ul><li>SORT_REGULAR - сравнивать элементы в нормальном порядке, не меняя типов;</li>
15
<ul><li>SORT_REGULAR - сравнивать элементы в нормальном порядке, не меняя типов;</li>
16
<li>SORT_NUMERIC - сравнивать элементы как числа;</li>
16
<li>SORT_NUMERIC - сравнивать элементы как числа;</li>
17
<li>SORT_STRING - сравнивать элементы как строки;</li>
17
<li>SORT_STRING - сравнивать элементы как строки;</li>
18
<li>SORT_LOCALE_STRING - сравнивать элементы как строки, руководствуясь текущим местонахождением, то есть локалью <a>(Locale</a>);</li>
18
<li>SORT_LOCALE_STRING - сравнивать элементы как строки, руководствуясь текущим местонахождением, то есть локалью <a>(Locale</a>);</li>
19
<li>SORT_NATURAL - сравнивать элементы как строки в естественном порядке;</li>
19
<li>SORT_NATURAL - сравнивать элементы как строки в естественном порядке;</li>
20
<li>SORT_FLAG_CASE - можно объединить с SORT_STRING или SORT_NATURAL, чтобы сделать сортировку нечувствительной к регистру.</li>
20
<li>SORT_FLAG_CASE - можно объединить с SORT_STRING или SORT_NATURAL, чтобы сделать сортировку нечувствительной к регистру.</li>
21
</ul><p>Давайте попробуем в действии отсортировать массивы разными способами. В этом нам помогут редактор кода<a>Notepad++</a>и среда разработки<a>XAMPP</a>для запуска PHP-кода в браузере.</p>
21
</ul><p>Давайте попробуем в действии отсортировать массивы разными способами. В этом нам помогут редактор кода<a>Notepad++</a>и среда разработки<a>XAMPP</a>для запуска PHP-кода в браузере.</p>
22
<p>Во всех примерах будем сначала выводить исходный массив, а затем его же после сортировки (помните, что сортировка меняет массив, то есть её результат сохраняется). Для удобства чтения будем осуществлять вывод с помощью привычной функции<a>echo</a>в связке с <a>implode()</a>/<a>print_r()</a>или циклом<a>foreach</a>.</p>
22
<p>Во всех примерах будем сначала выводить исходный массив, а затем его же после сортировки (помните, что сортировка меняет массив, то есть её результат сохраняется). Для удобства чтения будем осуществлять вывод с помощью привычной функции<a>echo</a>в связке с <a>implode()</a>/<a>print_r()</a>или циклом<a>foreach</a>.</p>
23
<p>Также для красоты будем сопровождать результаты подписями (HTML-заголовки<a><h2> и <h3></a>) и переносом строк (HTML-элемент<a><br></a>).</p>
23
<p>Также для красоты будем сопровождать результаты подписями (HTML-заголовки<a><h2> и <h3></a>) и переносом строк (HTML-элемент<a><br></a>).</p>
24
<?php echo "<h1>СОРТИРОВКА МАССИВОВ</h1>";Начало нашего кода<p>Создадим массив чисел и отсортируем его в порядке убывания, от большего значения к меньшему. Возьмём самый простой пример: массив зарплат в рублях:</p>
24
<?php echo "<h1>СОРТИРОВКА МАССИВОВ</h1>";Начало нашего кода<p>Создадим массив чисел и отсортируем его в порядке убывания, от большего значения к меньшему. Возьмём самый простой пример: массив зарплат в рублях:</p>
25
$salaries = array(45000, 65000, 35000, 75000, 55000);<p>Так он выглядит с выводом результата.</p>
25
$salaries = array(45000, 65000, 35000, 75000, 55000);<p>Так он выглядит с выводом результата.</p>
26
echo "<h2>Сортировка вакансий по зарплатам</h2>"; $salaries = array(45000, 65000, 35000, 75000, 55000); echo "<h3>Исходный массив вакансий по зарплатам целиком, до сортировки</h3>"; print_r($salaries); echo "<h3>Массив вакансий по зарплатам до сортировки -- только значения (исходный порядок)</h3>"; echo implode(", ", $salaries) . "<br>"; Код исходного массива зарплат с выводом результата<p>Исходный массив вакансий по зарплатам целиком, до сортировки:</p>
26
echo "<h2>Сортировка вакансий по зарплатам</h2>"; $salaries = array(45000, 65000, 35000, 75000, 55000); echo "<h3>Исходный массив вакансий по зарплатам целиком, до сортировки</h3>"; print_r($salaries); echo "<h3>Массив вакансий по зарплатам до сортировки -- только значения (исходный порядок)</h3>"; echo implode(", ", $salaries) . "<br>"; Код исходного массива зарплат с выводом результата<p>Исходный массив вакансий по зарплатам целиком, до сортировки:</p>
27
Array ( [0] => 45000 [1] => 65000 [2] => 35000 [3] => 75000 [4] => 55000 )<p>Массив вакансий по зарплатам до сортировки - только значения (исходный порядок):</p>
27
Array ( [0] => 45000 [1] => 65000 [2] => 35000 [3] => 75000 [4] => 55000 )<p>Массив вакансий по зарплатам до сортировки - только значения (исходный порядок):</p>
28
45000, 65000, 35000, 75000, 55000<p>Как видим, сейчас зарплаты внутри массива расположены в произвольном порядке, а нам бы хотелось сначала увидеть самые выгодные вакансии. Значит, надо найти в таблице такой метод, который умеет сортировать значения в порядке убывания - нам подойдёт <a>rsort()</a>.</p>
28
45000, 65000, 35000, 75000, 55000<p>Как видим, сейчас зарплаты внутри массива расположены в произвольном порядке, а нам бы хотелось сначала увидеть самые выгодные вакансии. Значит, надо найти в таблице такой метод, который умеет сортировать значения в порядке убывания - нам подойдёт <a>rsort()</a>.</p>
29
rsort($array, FLAGS);<p>Объяснение:</p>
29
rsort($array, FLAGS);<p>Объяснение:</p>
30
<ul><li>rsort() - название функции, в скобках указываются параметры;</li>
30
<ul><li>rsort() - название функции, в скобках указываются параметры;</li>
31
<li>$array - массив для сортировки;</li>
31
<li>$array - массив для сортировки;</li>
32
<li>на месте опции FLAGS можно указать другие правила сортировки массива (флаги).</li>
32
<li>на месте опции FLAGS можно указать другие правила сортировки массива (флаги).</li>
33
</ul><p>А теперь попробуем нашу функцию в деле. На первом шаге передадим в неё массив с зарплатами - $salaries.</p>
33
</ul><p>А теперь попробуем нашу функцию в деле. На первом шаге передадим в неё массив с зарплатами - $salaries.</p>
34
rsort($salaries);<p>Далее прописываем вывод результата:</p>
34
rsort($salaries);<p>Далее прописываем вывод результата:</p>
35
echo "<h3>Массив вакансий по зарплатам после сортировки через rsort() (по значению, по убыванию)</h3>"; echo implode(", ", $salaries) . "<br>";Код для сортировки массива зарплат<p>Вот что у нас получилось на выходе:</p>
35
echo "<h3>Массив вакансий по зарплатам после сортировки через rsort() (по значению, по убыванию)</h3>"; echo implode(", ", $salaries) . "<br>";Код для сортировки массива зарплат<p>Вот что у нас получилось на выходе:</p>
36
75000, 65000, 55000, 45000, 35000<p>Теперь возьмёмся за массив текстовых значений.</p>
36
75000, 65000, 55000, 45000, 35000<p>Теперь возьмёмся за массив текстовых значений.</p>
37
<p>По <a>данным</a>Большой российской энциклопедии, в мире насчитывается более двухсот видов сов. Было бы неплохо создать про них сайт, чтобы каждый мог узнать о совах побольше! Начнём с создания "массива сов", руководствуясь<a>книгой</a>Ю. Б. Пукинского "Жизнь сов".</p>
37
<p>По <a>данным</a>Большой российской энциклопедии, в мире насчитывается более двухсот видов сов. Было бы неплохо создать про них сайт, чтобы каждый мог узнать о совах побольше! Начнём с создания "массива сов", руководствуясь<a>книгой</a>Ю. Б. Пукинского "Жизнь сов".</p>
38
echo "<h2>Сортируем сов</h2>"; $owls = array( "tytonidae" => "Сипухи", "tyto" => "Сипухи", "strigidae" => "Настоящие совы", "otus" => "Совки", "bubo" => "Филины", "ketupa" => "Рыбные совы", "nyctea" => "Белые совы", "surnia" => "Ястребиные совы", "glaucidium" => "Сычики", "ninox" => "Иглоногие совы", "athene" => "Сычи", "strix" => "Неясыти", "asfo" => "Ушастые совы", "aegolius" => "Мохноногие сычи" ); Код исходного массива видов совecho "<h3>Исходный массив названий видов сов целиком, до сортировки</h3>"; print_r($owls); echo "<h3>Названия видов сов до сортировки -- только значения (исходный порядок)</h3>"; echo implode(", ", $owls) . "<br>"; Код вывода исходного массива видов сов<p>Исходный массив названий видов сов целиком, до сортировки:</p>
38
echo "<h2>Сортируем сов</h2>"; $owls = array( "tytonidae" => "Сипухи", "tyto" => "Сипухи", "strigidae" => "Настоящие совы", "otus" => "Совки", "bubo" => "Филины", "ketupa" => "Рыбные совы", "nyctea" => "Белые совы", "surnia" => "Ястребиные совы", "glaucidium" => "Сычики", "ninox" => "Иглоногие совы", "athene" => "Сычи", "strix" => "Неясыти", "asfo" => "Ушастые совы", "aegolius" => "Мохноногие сычи" ); Код исходного массива видов совecho "<h3>Исходный массив названий видов сов целиком, до сортировки</h3>"; print_r($owls); echo "<h3>Названия видов сов до сортировки -- только значения (исходный порядок)</h3>"; echo implode(", ", $owls) . "<br>"; Код вывода исходного массива видов сов<p>Исходный массив названий видов сов целиком, до сортировки:</p>
39
Array ( [tytonidae] => Сипухи [tyto] => Сипухи [strigidae] => Настоящие совы [otus] => Совки [bubo] => Филины [ketupa] => Рыбные совы [nyctea] => Белые совы [surnia] => Ястребиные совы [glaucidium] => Сычики [ninox] => Иглоногие совы [athene] => Сычи [strix] => Неясыти [asfo] => Ушастые совы [aegolius] => Мохноногие сычи )<p>Названия видов сов до сортировки - только значения (исходный порядок):</p>
39
Array ( [tytonidae] => Сипухи [tyto] => Сипухи [strigidae] => Настоящие совы [otus] => Совки [bubo] => Филины [ketupa] => Рыбные совы [nyctea] => Белые совы [surnia] => Ястребиные совы [glaucidium] => Сычики [ninox] => Иглоногие совы [athene] => Сычи [strix] => Неясыти [asfo] => Ушастые совы [aegolius] => Мохноногие сычи )<p>Названия видов сов до сортировки - только значения (исходный порядок):</p>
40
Сипухи, Сипухи, Настоящие совы, Совки, Филины, Рыбные совы, Белые совы, Ястребиные совы, Сычики, Иглоногие совы, Сычи, Неясыти, Ушастые совы, Мохноногие сычи<p>В данном случае в роли ключей ассоциативного массива у нас выступают латинские названия видов, а значениями являются русские названия.</p>
40
Сипухи, Сипухи, Настоящие совы, Совки, Филины, Рыбные совы, Белые совы, Ястребиные совы, Сычики, Иглоногие совы, Сычи, Неясыти, Ушастые совы, Мохноногие сычи<p>В данном случае в роли ключей ассоциативного массива у нас выступают латинские названия видов, а значениями являются русские названия.</p>
41
<p>В зависимости от задачи нам может понадобиться как латинское, так и русское название. Кроме этого, было бы интересно иметь возможность получать информацию о случайно выбранной сове, а ещё - представлять текстовые значения в алфавитном порядке.</p>
41
<p>В зависимости от задачи нам может понадобиться как латинское, так и русское название. Кроме этого, было бы интересно иметь возможность получать информацию о случайно выбранной сове, а ещё - представлять текстовые значения в алфавитном порядке.</p>
42
<p>Отсюда вытекает необходимость использования сразу трёх различных функций сортировки:</p>
42
<p>Отсюда вытекает необходимость использования сразу трёх различных функций сортировки:</p>
43
<ul><li><a>ksort()</a>для сортировки по ключам (латинским названиям) по алфавиту;</li>
43
<ul><li><a>ksort()</a>для сортировки по ключам (латинским названиям) по алфавиту;</li>
44
<li><a>asort()</a>для сортировки по значениям (русским названиям), также по алфавиту;</li>
44
<li><a>asort()</a>для сортировки по значениям (русским названиям), также по алфавиту;</li>
45
<li><a>shuffle()</a>для получения случайных русских названий сов.</li>
45
<li><a>shuffle()</a>для получения случайных русских названий сов.</li>
46
</ul><p>Синтаксис ksort() и asort() такой же, как и в предыдущем примере у rsort(), а с shuffle() всё ещё проще - она принимает только название массива.</p>
46
</ul><p>Синтаксис ksort() и asort() такой же, как и в предыдущем примере у rsort(), а с shuffle() всё ещё проще - она принимает только название массива.</p>
47
<p>Посмотрим на функции в деле:</p>
47
<p>Посмотрим на функции в деле:</p>
48
ksort($owls); echo"<h3>Названия видов сов после сортировки через ksort() (по ключу, по алфавиту, по возрастанию)</h3>"; print_r(array_keys($owls)); asort($owls); echo "<h3>Названия видов сов после сортировки через asort() (по значению, по алфавиту, по возрастанию)</h3>"; echo implode(", ", $owls) . "<br>"; shuffle($owls); echo "<h3>Названия видов сов после сортировки через shuffle() (по значению, случайный порядок)</h3>"; echo implode(", ", $owls) . "<br>"; Код для сортировки массива видов сов<p>Названия видов сов после сортировки через ksort() (по ключу, по алфавиту, по возрастанию):</p>
48
ksort($owls); echo"<h3>Названия видов сов после сортировки через ksort() (по ключу, по алфавиту, по возрастанию)</h3>"; print_r(array_keys($owls)); asort($owls); echo "<h3>Названия видов сов после сортировки через asort() (по значению, по алфавиту, по возрастанию)</h3>"; echo implode(", ", $owls) . "<br>"; shuffle($owls); echo "<h3>Названия видов сов после сортировки через shuffle() (по значению, случайный порядок)</h3>"; echo implode(", ", $owls) . "<br>"; Код для сортировки массива видов сов<p>Названия видов сов после сортировки через ksort() (по ключу, по алфавиту, по возрастанию):</p>
49
Array ( [0] => aegolius [1] => asfo [2] => athene [3] => bubo [4] => glaucidium [5] => ketupa [6] => ninox [7] => nyctea [8] => otus [9] => strigidae [10] => strix [11] => surnia [12] => tyto [13] => tytonidae )<p>Названия видов сов после сортировки через asort() (по значению, по алфавиту, по возрастанию):</p>
49
Array ( [0] => aegolius [1] => asfo [2] => athene [3] => bubo [4] => glaucidium [5] => ketupa [6] => ninox [7] => nyctea [8] => otus [9] => strigidae [10] => strix [11] => surnia [12] => tyto [13] => tytonidae )<p>Названия видов сов после сортировки через asort() (по значению, по алфавиту, по возрастанию):</p>
50
Белые совы, Иглоногие совы, Мохноногие сычи, Настоящие совы, Неясыти, Рыбные совы, Сипухи, Сипухи, Совки, Сычи, Сычики, Ушастые совы, Филины, Ястребиные совы<p>Названия видов сов после сортировки через shuffle() (по значению, случайный порядок):</p>
50
Белые совы, Иглоногие совы, Мохноногие сычи, Настоящие совы, Неясыти, Рыбные совы, Сипухи, Сипухи, Совки, Сычи, Сычики, Ушастые совы, Филины, Ястребиные совы<p>Названия видов сов после сортировки через shuffle() (по значению, случайный порядок):</p>
51
Сипухи, Рыбные совы, Белые совы, Сычики, Совки, Сипухи, Мохноногие сычи, Ястребиные совы, Ушастые совы, Филины, Неясыти, Настоящие совы, Иглоногие совы, Сычи<p>Совы встали на свои места, а мы двигаемся дальше - к сортировке, имитирующей человеческую логику.</p>
51
Сипухи, Рыбные совы, Белые совы, Сычики, Совки, Сипухи, Мохноногие сычи, Ястребиные совы, Ушастые совы, Филины, Неясыти, Настоящие совы, Иглоногие совы, Сычи<p>Совы встали на свои места, а мы двигаемся дальше - к сортировке, имитирующей человеческую логику.</p>
52
<p>Предположим, у нас есть список подписчиков нашей группы в одном из возможных форматов - ссылками с id вида vk.com/idXXX.</p>
52
<p>Предположим, у нас есть список подписчиков нашей группы в одном из возможных форматов - ссылками с id вида vk.com/idXXX.</p>
53
echo "<h2>Сортируем ссылки на страницы во "Вконтакте" через natsort()</h2>"; $pages = array("vk.com/id30000", "vk.com/id10000", "vk.com/id20000"); echo "<h3>Исходный массив ссылок на страницы во "Вконтакте", до сортировки</h3>"; print_r($pages); Код исходного массива страниц во "Вконтакте" с выводом результата<p>Исходный массив ссылок на страницы во "Вконтакте", до сортировки:</p>
53
echo "<h2>Сортируем ссылки на страницы во "Вконтакте" через natsort()</h2>"; $pages = array("vk.com/id30000", "vk.com/id10000", "vk.com/id20000"); echo "<h3>Исходный массив ссылок на страницы во "Вконтакте", до сортировки</h3>"; print_r($pages); Код исходного массива страниц во "Вконтакте" с выводом результата<p>Исходный массив ссылок на страницы во "Вконтакте", до сортировки:</p>
54
Array ( [0] => vk.com/id30000 [1] => vk.com/id10000 [2] => vk.com/id20000 )<p>Было бы удобно расположить записи в порядке возрастания id, но есть нюанс: элементы массива являются строковыми значениями. Вот что показывает проверка типов:</p>
54
Array ( [0] => vk.com/id30000 [1] => vk.com/id10000 [2] => vk.com/id20000 )<p>Было бы удобно расположить записи в порядке возрастания id, но есть нюанс: элементы массива являются строковыми значениями. Вот что показывает проверка типов:</p>
55
echo "<h3>Проверка типа данных в массиве ссылок на страницы во "Вконтакте"</h3>"; foreach ($pages as $page) { echo gettype($page) . "<br>"; };<p>Вывод результата после проверки типа данных в массиве ссылок на страницы во "Вконтакте":</p>
55
echo "<h3>Проверка типа данных в массиве ссылок на страницы во "Вконтакте"</h3>"; foreach ($pages as $page) { echo gettype($page) . "<br>"; };<p>Вывод результата после проверки типа данных в массиве ссылок на страницы во "Вконтакте":</p>
56
string string string<p>Чтобы решить задачу, воспользуемся функцией естественной сортировки<a>natsort()</a>.</p>
56
string string string<p>Чтобы решить задачу, воспользуемся функцией естественной сортировки<a>natsort()</a>.</p>
57
natsort($array);<p>Объяснение:</p>
57
natsort($array);<p>Объяснение:</p>
58
<ul><li>natsort() - название функции, в скобках указывается единственный параметр;</li>
58
<ul><li>natsort() - название функции, в скобках указывается единственный параметр;</li>
59
<li>$array - массив, который нужно отсортировать естественным способом (как это бы сделал человек).</li>
59
<li>$array - массив, который нужно отсортировать естественным способом (как это бы сделал человек).</li>
60
</ul><p>Посмотрим на функцию в деле:</p>
60
</ul><p>Посмотрим на функцию в деле:</p>
61
natsort($pages); echo "<h3>Массив ссылок на страницы во "Вконтакте" после естественной сортировки через natsort() (по значению, по возрастанию)</h3>"; echo implode(", ", $pages) . "<br>";<p>Массив ссылок на страницы во "Вконтакте" после естественной сортировки через natsort() (по значению, по возрастанию):</p>
61
natsort($pages); echo "<h3>Массив ссылок на страницы во "Вконтакте" после естественной сортировки через natsort() (по значению, по возрастанию)</h3>"; echo implode(", ", $pages) . "<br>";<p>Массив ссылок на страницы во "Вконтакте" после естественной сортировки через natsort() (по значению, по возрастанию):</p>
62
vk.com/id10000, vk.com/id20000, vk.com/id30000<p>Теперь страницы отсортированы в удобном для работы формате.</p>
62
vk.com/id10000, vk.com/id20000, vk.com/id30000<p>Теперь страницы отсортированы в удобном для работы формате.</p>
63
<p>Для примера возьмём двумерный массив, состоящий, в свою очередь, из двух массивов: марок автомобильного топлива и цен на него некоторое время назад.</p>
63
<p>Для примера возьмём двумерный массив, состоящий, в свою очередь, из двух массивов: марок автомобильного топлива и цен на него некоторое время назад.</p>
64
echo "<h2>Сортируем цены на бензин и дизельное топливо (в рублях) через array_multisort()</h2>"; $petrol = array( array("52,75", "61,95", "54,01", "47,60"), array("АИ-95", "АИ-98", "ДТ", "АИ-92") ); echo "<h3>Марки топлива и цены на него до сортировки(исходный порядок)</h3>"; print_r(array_values($petrol)); Код исходного массива цен на топливо с выводом результата<p>Марки топлива и цены на него до сортировки (исходный порядок):</p>
64
echo "<h2>Сортируем цены на бензин и дизельное топливо (в рублях) через array_multisort()</h2>"; $petrol = array( array("52,75", "61,95", "54,01", "47,60"), array("АИ-95", "АИ-98", "ДТ", "АИ-92") ); echo "<h3>Марки топлива и цены на него до сортировки(исходный порядок)</h3>"; print_r(array_values($petrol)); Код исходного массива цен на топливо с выводом результата<p>Марки топлива и цены на него до сортировки (исходный порядок):</p>
65
Array ( [0] => Array ( [0] => 52,75 [1] => 61,95 [2] => 54,01 [3] => 47,60 ) [1] => Array ( [0] => АИ-95 [1] => АИ-98 [2] => ДТ [3] => АИ-92 ) )<p>Сейчас здесь есть взаимное соответствие (например, АИ-92 стоит 47,60), но сами значения не отсортированы в каком-либо порядке. Попробуем с помощью функции сортировки <a>array_multisort()</a>вывести для пользователя список ценников, отсортированный по возрастанию, где сначала идёт самый дешёвый бензин.</p>
65
Array ( [0] => Array ( [0] => 52,75 [1] => 61,95 [2] => 54,01 [3] => 47,60 ) [1] => Array ( [0] => АИ-95 [1] => АИ-98 [2] => ДТ [3] => АИ-92 ) )<p>Сейчас здесь есть взаимное соответствие (например, АИ-92 стоит 47,60), но сами значения не отсортированы в каком-либо порядке. Попробуем с помощью функции сортировки <a>array_multisort()</a>вывести для пользователя список ценников, отсортированный по возрастанию, где сначала идёт самый дешёвый бензин.</p>
66
<p>Функция array_multisort() предназначена как раз для сортировки многомерных массивов. Вот её синтаксис:</p>
66
<p>Функция array_multisort() предназначена как раз для сортировки многомерных массивов. Вот её синтаксис:</p>
67
array_multisort($array1, $array1_sort_order, $array1_sort_flags, $other);<p>Объяснение:</p>
67
array_multisort($array1, $array1_sort_order, $array1_sort_flags, $other);<p>Объяснение:</p>
68
<ul><li>array_multisort() - название функции, в скобках указываются параметры;</li>
68
<ul><li>array_multisort() - название функции, в скобках указываются параметры;</li>
69
<li>$array1 - первый массив для сортировки;</li>
69
<li>$array1 - первый массив для сортировки;</li>
70
<li>на месте опции $array1_sort_order можно указать порядок сортировки первого массива (можно не указывать);</li>
70
<li>на месте опции $array1_sort_order можно указать порядок сортировки первого массива (можно не указывать);</li>
71
<li>на месте опции $array1_sort_flags можно указать другие правила сортировки первого массива (флаги) в дополнение к предыдущей опции;</li>
71
<li>на месте опции $array1_sort_flags можно указать другие правила сортировки первого массива (флаги) в дополнение к предыдущей опции;</li>
72
<li>на месте $other можно вписать ещё один массив $array2 с опциями или без (и так далее).</li>
72
<li>на месте $other можно вписать ещё один массив $array2 с опциями или без (и так далее).</li>
73
</ul><p>Применим функцию в деле:</p>
73
</ul><p>Применим функцию в деле:</p>
74
echo("<h3>Сортировка марок топлива и цен через array_multisort() (по возрастанию)</h3>"); array_multisort($petrol[0], $petrol[1]); echo implode(" -- ", $petrol[1]) . "<br>"; echo implode(" -- ", $petrol[0]) . "<br>";<p>Вывод отсортированного массива марок топлива и цен через array_multisort() (по возрастанию):</p>
74
echo("<h3>Сортировка марок топлива и цен через array_multisort() (по возрастанию)</h3>"); array_multisort($petrol[0], $petrol[1]); echo implode(" -- ", $petrol[1]) . "<br>"; echo implode(" -- ", $petrol[0]) . "<br>";<p>Вывод отсортированного массива марок топлива и цен через array_multisort() (по возрастанию):</p>
75
АИ-92 -- АИ-95 -- ДТ -- АИ-98 47,60--52,75--54,01--61,95<p>Теперь марки топлива расположены по возрастанию цены, а мы возьмём ещё более интересный пример - сортировку по кастомным правилам.</p>
75
АИ-92 -- АИ-95 -- ДТ -- АИ-98 47,60--52,75--54,01--61,95<p>Теперь марки топлива расположены по возрастанию цены, а мы возьмём ещё более интересный пример - сортировку по кастомным правилам.</p>
76
<p>Предположим, у нашей компании есть корпоративный портал, где можно посмотреть информацию о коллегах. Пусть у нас в массиве будет шесть коллег. База содержит Ф. И. О., внутренний ID, должность и возраст, а карточка каждого сотрудника является отдельным массивом многомерного массива:</p>
76
<p>Предположим, у нашей компании есть корпоративный портал, где можно посмотреть информацию о коллегах. Пусть у нас в массиве будет шесть коллег. База содержит Ф. И. О., внутренний ID, должность и возраст, а карточка каждого сотрудника является отдельным массивом многомерного массива:</p>
77
echo "<h2>Сортируем сотрудников компании</h2>"; $employees = array( array( "ID" => 1, "ФИО" => "Вувузела Андрей Павлович", "Должность" => "Менеджер", "Возраст" => "29" ), array( "ID" => 2, "ФИО" => "Ахрюнов Алексей Степанович", "Должность" => "Бухгалтер", "Возраст" => "32" ), array( "ID" => 3, "ФИО" => "Охрюненко Борис Гориславович", "Должность" => "Курьер", "Возраст" => "22" ), array( "ID" => 4, "ФИО" => "Бокакин Арсений Брониславович", "Должность" => "Менеджер", "Возраст" => "31" ), array( "ID" => 5, "ФИО" => "Голохрюхин Евгений Владимирович", "Должность" => "Директор", "Возраст" => "40" ), array( "ID" => 6, "ФИО" => "Совакошка Мария Игоревна", "Должность" => "Старший инженер", "Возраст" => "26" ) );<p>Код вывода исходного массива карточек сотрудников компании:</p>
77
echo "<h2>Сортируем сотрудников компании</h2>"; $employees = array( array( "ID" => 1, "ФИО" => "Вувузела Андрей Павлович", "Должность" => "Менеджер", "Возраст" => "29" ), array( "ID" => 2, "ФИО" => "Ахрюнов Алексей Степанович", "Должность" => "Бухгалтер", "Возраст" => "32" ), array( "ID" => 3, "ФИО" => "Охрюненко Борис Гориславович", "Должность" => "Курьер", "Возраст" => "22" ), array( "ID" => 4, "ФИО" => "Бокакин Арсений Брониславович", "Должность" => "Менеджер", "Возраст" => "31" ), array( "ID" => 5, "ФИО" => "Голохрюхин Евгений Владимирович", "Должность" => "Директор", "Возраст" => "40" ), array( "ID" => 6, "ФИО" => "Совакошка Мария Игоревна", "Должность" => "Старший инженер", "Возраст" => "26" ) );<p>Код вывода исходного массива карточек сотрудников компании:</p>
78
echo "<h3>Записи сотрудников компании до сортировки(исходный порядок)</h3>"; print_r(array_values($employees));<p>Вывод исходного массива карточек сотрудников компании до сортировки (исходный порядок):</p>
78
echo "<h3>Записи сотрудников компании до сортировки(исходный порядок)</h3>"; print_r(array_values($employees));<p>Вывод исходного массива карточек сотрудников компании до сортировки (исходный порядок):</p>
79
Array ( [0] => Array ( [ID] => 1 [ФИО] => Вувузела Андрей Павлович [Должность] => Менеджер [Возраст] => 29 ) [1] => Array ( [ID] => 2 [ФИО] => Ахрюнов Алексей Степанович [Должность] => Бухгалтер [Возраст] => 32 ) [2] => Array ( [ID] => 3 [ФИО] => Охрюненко Борис Гориславович [Должность] => Курьер [Возраст] => 22 ) [3] => Array ( [ID] => 4 [ФИО] => Бокакин Арсений Брониславович [Должность] => Менеджер [Возраст] => 31 ) [4] => Array ( [ID] => 5 [ФИО] => Голохрюхин Евгений Владимирович [Должность] => Директор [Возраст] => 40 ) [5] => Array ( [ID] => 6 [ФИО] => Совакошка Мария Игоревна [Должность] => Старший инженер [Возраст] => 26 ) )<p>Дадим пользователю корпоративного портала возможность сортировки списка по фамилиям, возрасту и порядковому номеру. В этом нам поможет функция пользовательской сортировки<a>usort()</a>.</p>
79
Array ( [0] => Array ( [ID] => 1 [ФИО] => Вувузела Андрей Павлович [Должность] => Менеджер [Возраст] => 29 ) [1] => Array ( [ID] => 2 [ФИО] => Ахрюнов Алексей Степанович [Должность] => Бухгалтер [Возраст] => 32 ) [2] => Array ( [ID] => 3 [ФИО] => Охрюненко Борис Гориславович [Должность] => Курьер [Возраст] => 22 ) [3] => Array ( [ID] => 4 [ФИО] => Бокакин Арсений Брониславович [Должность] => Менеджер [Возраст] => 31 ) [4] => Array ( [ID] => 5 [ФИО] => Голохрюхин Евгений Владимирович [Должность] => Директор [Возраст] => 40 ) [5] => Array ( [ID] => 6 [ФИО] => Совакошка Мария Игоревна [Должность] => Старший инженер [Возраст] => 26 ) )<p>Дадим пользователю корпоративного портала возможность сортировки списка по фамилиям, возрасту и порядковому номеру. В этом нам поможет функция пользовательской сортировки<a>usort()</a>.</p>
80
usort($array, "function");<p>Объяснение:</p>
80
usort($array, "function");<p>Объяснение:</p>
81
<ul><li>usort() - название функции, в скобках указываются параметры.</li>
81
<ul><li>usort() - название функции, в скобках указываются параметры.</li>
82
<li>$array - массив для сортировки.</li>
82
<li>$array - массив для сортировки.</li>
83
<li>"function" - название вашей функции сравнения с собственными правилами сортировки. Она объявляется заранее и принимает два параметра. Обратите внимание на кавычки, в которые заключается название.</li>
83
<li>"function" - название вашей функции сравнения с собственными правилами сортировки. Она объявляется заранее и принимает два параметра. Обратите внимание на кавычки, в которые заключается название.</li>
84
</ul><p>Применим функцию в деле - на сортировке сотрудников по алфавиту, по возрасту (по возрастанию) и по ID (по убыванию).</p>
84
</ul><p>Применим функцию в деле - на сортировке сотрудников по алфавиту, по возрасту (по возрастанию) и по ID (по убыванию).</p>
85
<p>Обратите внимание:</p>
85
<p>Обратите внимание:</p>
86
<ul><li>В каждом из трёх примеров ниже мы сначала объявляем пользовательскую функцию сравнения (alphSort, ageSort и idSort соответственно), а потом передаём её встроенной функции usort() в качестве обработчика массива.</li>
86
<ul><li>В каждом из трёх примеров ниже мы сначала объявляем пользовательскую функцию сравнения (alphSort, ageSort и idSort соответственно), а потом передаём её встроенной функции usort() в качестве обработчика массива.</li>
87
<li>Цикл foreach помогает по очереди перебирать карточки каждого сотрудника в главном массиве $employees. Для удобства мы в рамках цикла обзываем их $employee - то же самое английское слово в единственном числе.</li>
87
<li>Цикл foreach помогает по очереди перебирать карточки каждого сотрудника в главном массиве $employees. Для удобства мы в рамках цикла обзываем их $employee - то же самое английское слово в единственном числе.</li>
88
<li>Для доступа к нужным ключам вложенных массивов (карточек сотрудников) используется<a>синтаксис</a>с квадратными скобками: $array["key"] и так далее.</li>
88
<li>Для доступа к нужным ключам вложенных массивов (карточек сотрудников) используется<a>синтаксис</a>с квадратными скобками: $array["key"] и так далее.</li>
89
</ul>echo "<h3>Сортировка сотрудников по ФИО через usort() и strcmp (по алфавиту)</h3>"; function alphSort($name1, $name2) { return strcmp($name1["ФИО"], $name2["ФИО"]); }; usort($employees, "alphSort"); foreach ($employees as $employee) { echo "ID " . $employee["ID"] . ", " . "<b>ФИО: " . $employee["ФИО"] . ",</b> " . "Должность: " . $employee["Должность"] . ", " . "Возраст: " . $employee["Возраст"] . "<br>"; };<p>Функция alphSort() принимает по два значения ФИО ($name1 и $name2) и сравнивает их как строки с помощью встроенной функции <a>strcmp()</a>. Она передаётся во встроенную функцию usort(), где и применяется на нашем массиве.</p>
89
</ul>echo "<h3>Сортировка сотрудников по ФИО через usort() и strcmp (по алфавиту)</h3>"; function alphSort($name1, $name2) { return strcmp($name1["ФИО"], $name2["ФИО"]); }; usort($employees, "alphSort"); foreach ($employees as $employee) { echo "ID " . $employee["ID"] . ", " . "<b>ФИО: " . $employee["ФИО"] . ",</b> " . "Должность: " . $employee["Должность"] . ", " . "Возраст: " . $employee["Возраст"] . "<br>"; };<p>Функция alphSort() принимает по два значения ФИО ($name1 и $name2) и сравнивает их как строки с помощью встроенной функции <a>strcmp()</a>. Она передаётся во встроенную функцию usort(), где и применяется на нашем массиве.</p>
90
<p>Вывод отсортированного массива карточек сотрудников компании. Вариант первый - ФИО по алфавиту:</p>
90
<p>Вывод отсортированного массива карточек сотрудников компании. Вариант первый - ФИО по алфавиту:</p>
91
ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40 ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26<p>Следующие два примера строятся по похожему принципу. Вот код для сортировки массива карточек сотрудников компании. Вариант второй - по возрасту.</p>
91
ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40 ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26<p>Следующие два примера строятся по похожему принципу. Вот код для сортировки массива карточек сотрудников компании. Вариант второй - по возрасту.</p>
92
echo "<h3>Сортировка сотрудников по возрасту через usort() (по возрастанию)</h3>"; function ageSort($age1, $age2) { if ($age1["Возраст"] == $age2["Возраст"]) { return 0; } return ($age1["Возраст"] < $age2["Возраст"]) ? -1 : 1; }; usort($employees, "ageSort"); foreach ($employees as $employee) { echo "ID " . $employee["ID"] . ", " . "ФИО: " . $employee["ФИО"] . ", " . "Должность: " . $employee["Должность"] . ", " . "<b>Возраст: " . $employee["Возраст"] . "</b><br>"; };<p>Функция ageSort() должна сравнивать по два значения возраста сотрудников (в данном примере - $age1, $age2), и возвращать результат (отсортированный массив) в зависимости от результата сравнения. Она также передаётся во встроенную функцию usort().</p>
92
echo "<h3>Сортировка сотрудников по возрасту через usort() (по возрастанию)</h3>"; function ageSort($age1, $age2) { if ($age1["Возраст"] == $age2["Возраст"]) { return 0; } return ($age1["Возраст"] < $age2["Возраст"]) ? -1 : 1; }; usort($employees, "ageSort"); foreach ($employees as $employee) { echo "ID " . $employee["ID"] . ", " . "ФИО: " . $employee["ФИО"] . ", " . "Должность: " . $employee["Должность"] . ", " . "<b>Возраст: " . $employee["Возраст"] . "</b><br>"; };<p>Функция ageSort() должна сравнивать по два значения возраста сотрудников (в данном примере - $age1, $age2), и возвращать результат (отсортированный массив) в зависимости от результата сравнения. Она также передаётся во встроенную функцию usort().</p>
93
<p>Вывод отсортированного массива карточек сотрудников компании. Вариант второй - по возрасту:</p>
93
<p>Вывод отсортированного массива карточек сотрудников компании. Вариант второй - по возрасту:</p>
94
ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40<p>Код для сортировки массива карточек сотрудников компании. Вариант третий - по ID:</p>
94
ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40<p>Код для сортировки массива карточек сотрудников компании. Вариант третий - по ID:</p>
95
echo "<h3>Сортировка сотрудников по ID через usort() (по убыванию)</h3>"; function idSort($id1, $id2) { if ($id1["ID"] == $id2["ID"]) { return 0; } return ($id1["ID"] < $id2["ID"]) ? 1 : -1; }; usort($employees, "idSort"); foreach ($employees as $employee) { echo "<b>ID " . $employee["ID"] . ",</b> " . "ФИО: " . $employee["ФИО"] . ", " . "Должность: " . $employee["Должность"] . ", " . "Возраст: " . $employee["Возраст"] . "<br>"; }; ?><p>Аналогично прошлому примеру, здесь функция idSort() тоже заточена на сравнение по двум значениям - теперь это ID сотрудников ($id1, $id2) - и возвращает результат (отсортированный массив) в зависимости от результата сравнения.</p>
95
echo "<h3>Сортировка сотрудников по ID через usort() (по убыванию)</h3>"; function idSort($id1, $id2) { if ($id1["ID"] == $id2["ID"]) { return 0; } return ($id1["ID"] < $id2["ID"]) ? 1 : -1; }; usort($employees, "idSort"); foreach ($employees as $employee) { echo "<b>ID " . $employee["ID"] . ",</b> " . "ФИО: " . $employee["ФИО"] . ", " . "Должность: " . $employee["Должность"] . ", " . "Возраст: " . $employee["Возраст"] . "<br>"; }; ?><p>Аналогично прошлому примеру, здесь функция idSort() тоже заточена на сравнение по двум значениям - теперь это ID сотрудников ($id1, $id2) - и возвращает результат (отсортированный массив) в зависимости от результата сравнения.</p>
96
<p>Вывод отсортированного массива карточек сотрудников компании. Вариант третий - по ID:</p>
96
<p>Вывод отсортированного массива карточек сотрудников компании. Вариант третий - по ID:</p>
97
ID6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29<p>Мы рассмотрели основные виды сортировок массивов в PHP: числовую, алфавитную, естественную, многомерную и пользовательскую. Для всего этого мы нашли подходящие функции.</p>
97
ID6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29<p>Мы рассмотрели основные виды сортировок массивов в PHP: числовую, алфавитную, естественную, многомерную и пользовательскую. Для всего этого мы нашли подходящие функции.</p>
98
<p>Для более детального знакомства с функциями сортировки массивов в PHP рекомендуем пользоваться таблицами-напоминалками: в разных руководствах они сделаны по-разному, поэтому лучше найти ту табличку, которая будет удобна именно вам. А для синтаксически правильного применения советуем пользоваться<a>официальной документацией</a>языка, тем более она переведена на русский.</p>
98
<p>Для более детального знакомства с функциями сортировки массивов в PHP рекомендуем пользоваться таблицами-напоминалками: в разных руководствах они сделаны по-разному, поэтому лучше найти ту табличку, которая будет удобна именно вам. А для синтаксически правильного применения советуем пользоваться<a>официальной документацией</a>языка, тем более она переведена на русский.</p>
99
<a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>
99
<a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>