Как отсортировать массив php
Перейти к содержимому

Как отсортировать массив php

  • автор:

Сортировка массивов

В PHP есть несколько функций для сортировки массивов, на этой странице даётся их общее описание.

Основные различия между функциями:

  • В одних функциях массивы ( array ) сортируются по ключам элементов, в других по значениям: $array[‘ключ’] = ‘значение’;
  • В каких-то функциях связь между ключами и значениями после сортировки сохраняется, в каких-то нет. Это может приводить к тому, что ключи будут сбрасываться в числовые значения (0, 1, 2, . ).
  • Различия в порядке сортировки: алфавитный, возрастающий, убывающий, числовой, естественный, случайный или определённый пользователем
  • Примечание: Все функции сортировки модифицируют переданный массив, а не возвращают отсортированную копию
  • Если какая-либо из этих функций сортировки оценивает два элемента как равные, они сохраняют свой исходный порядок. До PHP 8.0.0 их порядок не был определён (сортировка была нестабильной).

Свойства функций сортировки

Имя функции Сортирует по Сохраняет связь ключ — значение Порядок сортировки Похожие функции
array_multisort() значению строковые ( string ) ключи да, числовые ( int ) — нет первый массив или настройки сортировки array_walk()
asort() значению да по возрастанию arsort()
arsort() значению да по убыванию asort()
krsort() ключу да по убыванию ksort()
ksort() ключу да по возрастанию krsort()
natcasesort() значению да естественный, нечувствительный к регистру natsort()
natsort() значению да естественный natcasesort()
rsort() значению нет по убыванию sort()
shuffle() значению нет случайный array_rand()
sort() значению нет по возрастанию rsort()
uasort() значению да определяется пользователем uksort()
uksort() ключу да определяется пользователем uasort()
usort() значению нет определяется пользователем uasort()

User Contributed Notes 2 notes

10 years ago

While this may seem obvious, user-defined array sorting functions ( uksort(), uasort(), usort() ) will *not* be called if the array does not have *at least two values in it*.

The following code:

function usortTest ( $a , $b ) var_dump ( $a );
var_dump ( $b );
return — 1 ;
>

$test = array( ‘val1’ );
usort ( $test , «usortTest» );

$test2 = array( ‘val2’ , ‘val3’ );
usort ( $test2 , «usortTest» );

string(4) «val3»
string(4) «val2»

The first array doesn’t get sent to the function.

Please, under no circumstance, place any logic that modifies values, or applies non-sorting business logic in these functions as they will not always be executed.

12 years ago

Another way to do a case case-insensitive sort by key would simply be:

uksort ( $array , ‘strcasecmp’ );
?>

Since strcasecmp is already predefined in php it saves you the trouble to actually write the comparison function yourself.

  • Массивы
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Сортировка массивов
    • Функции для работы с массивами
    • Copyright © 2001-2023 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    krsort

    Замечание:

    Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

    Замечание:

    Сбрасывает внутренний указатель массива на первый элемент.

    Список параметров

    Необязательный второй параметр flags может использоваться для изменения поведения сортировки с использованием следующих значений:

    • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
    • SORT_NUMERIC — числовое сравнение элементов
    • SORT_STRING — строковое сравнение элементов
    • SORT_LOCALE_STRING — сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
    • SORT_NATURAL — сравнение элементов как строки, используя «естественный порядок», например natsort()
    • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

    Возвращаемые значения

    Функция всегда возвращает true .

    Список изменений

    Версия Описание
    8.2.0 Тип возвращаемого значения теперь true ; ранее было bool .

    Примеры

    Пример #1 Пример использования krsort()

    $fruits = array( «d» => «lemon» , «a» => «orange» , «b» => «banana» , «c» => «apple» );
    krsort ( $fruits );
    foreach ( $fruits as $key => $val ) echo » $key = $val \n» ;
    >
    ?>

    Результат выполнения данного примера:

    d = lemon c = apple b = banana a = orange

    Смотрите также

    • sort() — Сортирует массив по возрастанию
    • ksort() — Сортирует массив по ключу в порядке возрастания
    • Сравнение функций сортировки массивов

    User Contributed Notes 2 notes

    18 years ago

    To create a natural reverse sorting by keys, use the following function:

    function natkrsort ( $array )
    $keys = array_keys ( $array );
    natsort ( $keys );

    foreach ( $keys as $k )
    $new_array [ $k ] = $array [ $k ];
    >

    $new_array = array_reverse ( $new_array , true );

    19 years ago

    Best deal sorting:

    This is a function that will sort an array with integer keys (weight) and float values (cost) and delete ‘bad deals’ — entries that are more costly than other entries that have greater or equal weight.

    Input: an array of unsorted weight/cost pairs
    Output: none

    function BEST_DEALS($myarray)
    < // most weight for least cost:
    // ? Peter Kionga-Kamau, http://www.pmkmedia.com
    // thanks to Nafeh for the reversal trick
    // free for unrestricted use.
    krsort($myarray, SORT_NUMERIC);
    while(list($weight, $cost) = each($myarray))
    < // delete bad deals, retain best deals:
    if(!$lastweight)
    $lastweight=$weight;
    $lastcost = $cost;
    >
    else if($cost >= $lastcost) unset($myarray[$weight]);
    else
    $lastweight=$weight;
    $lastcost = $cost;
    >
    >
    ksort($myarray);
    >

    • Функции для работы с массивами
      • array_​change_​key_​case
      • array_​chunk
      • array_​column
      • array_​combine
      • array_​count_​values
      • array_​diff_​assoc
      • array_​diff_​key
      • array_​diff_​uassoc
      • array_​diff_​ukey
      • array_​diff
      • array_​fill_​keys
      • array_​fill
      • array_​filter
      • array_​flip
      • array_​intersect_​assoc
      • array_​intersect_​key
      • array_​intersect_​uassoc
      • array_​intersect_​ukey
      • array_​intersect
      • array_​is_​list
      • array_​key_​exists
      • array_​key_​first
      • array_​key_​last
      • array_​keys
      • array_​map
      • array_​merge_​recursive
      • array_​merge
      • array_​multisort
      • array_​pad
      • array_​pop
      • array_​product
      • array_​push
      • array_​rand
      • array_​reduce
      • array_​replace_​recursive
      • array_​replace
      • array_​reverse
      • array_​search
      • array_​shift
      • array_​slice
      • array_​splice
      • array_​sum
      • array_​udiff_​assoc
      • array_​udiff_​uassoc
      • array_​udiff
      • array_​uintersect_​assoc
      • array_​uintersect_​uassoc
      • array_​uintersect
      • array_​unique
      • array_​unshift
      • array_​values
      • array_​walk_​recursive
      • array_​walk
      • array
      • arsort
      • asort
      • compact
      • count
      • current
      • end
      • extract
      • in_​array
      • key_​exists
      • key
      • krsort
      • ksort
      • list
      • natcasesort
      • natsort
      • next
      • pos
      • prev
      • range
      • reset
      • rsort
      • shuffle
      • sizeof
      • sort
      • uasort
      • uksort
      • usort
      • each
      • Copyright © 2001-2023 The PHP Group
      • My PHP.net
      • Contact
      • Other PHP.net sites
      • Privacy policy

      Как сортировать массивы в PHP

      Определенную информацию всегда легче получать из отсортированных данных, в обратном случае вам приходится пересматривать по очереди каждый элемент массива. Например, предположим, что вы храните оценки разных учеников одного класса в массиве или таблице. Если данные не отсортированы по оценкам, вам нужно пересмотреть оценку каждого учащегося, чтобы определить, кто получил самую высокую или или самую низкую. Если данные уже отсортированы от самой низкой к более высокой, то просто взглянув на оценку первого ученика, вы будете знать этот показатель.

      Сортировка делает много простых и еффективных задач на основе доступа или получения определенного набора данных. В этом уроке мы узнаем, как использовать встроенные функции PHP для сортировки различных типов массивов.

      Сортировка массива по значению

      Сортировка PHP массива по значению его элементов очень проста. Вы можете выбрать сохранение или отклонение ассоциативных массивов, а также назначить собственные функции, чтобы определить порядок сортировки элементов. В этой статье я покажу, как это сделать .

      Для сортировки значений массива от низкого к высокому вы можете использовать функцию sort(&$array, $sort_flags) . Однако, при сортировке массива он не будет поддерживать никаких ассоциаций ключевых значений. Вместо простой перестановки новые ключи назначаются отсортированным элементам. Необязательный второй параметр указывает порядок сортировки элементов и может иметь шесть разных значений:

      1. SORT_REGULAR — сортировка значений без изменения их типов.
      2. SORT_NUMERIC — сортировка значений путем их численного сравнения.
      3. SORT_STRING — сортировка значений, сравнивая их как стринги.
      4. SORT_LOCALE_STRING — сравнивание значений в виде строки в текущей локалке. Вы можете обновить локалку самостоятельно, используя setlocale() .
      5. SORT_NATURAL — сортирует элементы, используя «естественный порядок» и сравнивая их как строки.
      6. SORT_FLAG_CASE — этот параметр можно комбинировать с SORT_STRING или SORT_NATURAL для отключения чувствительности к регистру при сортировке строк.

      Вот несколько примеров, которые помогут вам быстро понять разницу между всеми типами сортировки.

      $random_data = [32508, 98134, "234984", "3249832", "38", 123, "Apple"]; 
      sort($random_data); 
      echo "Regular Sorting — "; 
      foreach($random_data as $element)  
      echo str_pad($element, 9)." "; 
      // Regular Sorting — 38 123 32508 98134 234984 3249832 Apple 
      sort($random_data, SORT_NUMERIC); 
      echo "\nNumeric Sorting — "; 
      foreach($random_data as $element)  
      echo str_pad($element, 9)." "; 
      // Numeric Sorting — Apple 38 123 32508 98134 234984 3249832 
      sort($random_data, SORT_STRING); 
      echo "\nString Sorting — "; 
      foreach($random_data as $element)  
      echo str_pad($element, 9)." "; 
      // String Sorting — 123 234984 3249832 32508 38 98134 Apple 

      В примере обычной сортировки числовые строки преобразуются в их числовые значения, и сортировка выполняется соответствующим образом. Строка «Apple» не является числовой, поэтому она остается нетронутой и сравнивается как строка.

      Во втором примере наводится числовая сортировка, и мы хотим, чтобы данные сортировались по числовому значению, поэтому «Apple» преобразуется в числовое значение 0 и идет первым. Остальные значения отсортированы ожидаемым образом.

      В третьем примере все значения обрабатываются как строки. Это означает, что вместо сравнения числового значения 123 или 3249832 с 38 они сравниваются как строки — по одному символу за раз. Поскольку «1» предшествует «3», значение 123 считается ниже 38.

      Если вы хотите отсортировать значения массива от высокого к низкому вместо низкого к высокому, вы можете сделать это с помощью функции rsort() . Он принимает все те же параметры, что и sort() , сортируя значения в обратном порядке. Он также не поддерживает ассоциации ключевых значений, поэтому это неподходящий способ для сортировки ассоциативных массивов.

      Сортировка ассоциативных массивов

      Ассоциации ключевых значений важны, в случае если вы имеете дело с ассоциативными массивами. Рассмотрим следующий пример, где ассоциативный массив используется для хранения имен разных людей и их любимых фруктов. Если вы хотите отсортировать список в алфавитном порядке по названию фруктов, использование функции sort() из предыдущего раздела приведет к потере ассоциативных ключей.

      $fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; 
      echo "Before Sorting — \n"; 
      foreach($fruit_preferences as $person=>$preference)  
      echo $person." likes ".$preference."\n"; 
      Before Sorting — 
      James likes Orange 
      John likes Banana 
      Patricia likes Apple 
      Jennifer likes Mango 
      Mary likes Grapes 
      sort($fruit_preferences); 
      echo "After Sorting — \n"; 
      foreach($fruit_preferences as $person=>$preference)  
      echo $person." likes ".$preference."\n"; 
      After Sorting — 
      0 likes Apple 
      1 likes Banana 
      2 likes Grapes 
      3 likes Mango 
      4 likes Orange 

      Как видите, мы не только потеряли взаимосвязь между людьми и их любимыми фруктами, мы также потеряли имена этих людей. Каждому отсортированному значению был присвоен новый числовой индекс, основанный на его позиции в отсортированном массиве.

      Чтобы легко решить эту проблему, в PHP есть две разные функции, поддерживающие взаимосвязь между ассоциациями ключевых значений, сортируя массивы по их значениям. Этими двумя функциями являются asort() и arsort() . Следующий фрагмент кода сортирует тот же массив $fruit_preferences , но использует функцию asort() .

      $fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; 
      echo "Before Sorting — \n"; 
      foreach($fruit_preferences as $person=>$preference)  
      echo $person." likes ".$preference."\n"; 
      Before Sorting — 
      James likes Orange 
      John likes Banana 
      Patricia likes Apple 
      Jennifer likes Mango 
      Mary likes Grapes 
      asort($fruit_preferences); 
      echo "After Sorting — \n"; 
      foreach($fruit_preferences as $person=>$preference)  
      echo $person." likes ".$preference."\n"; 
      After Sorting — 
      Patricia likes Apple 
      John likes Banana 
      Mary likes Grapes 
      Jennifer likes Mango 
      James likes Orange 

      Как видно из приведенного выше примера, значение Apple движется к верху, сохраняя при этом свою связь с Patricia. Названия фруктов можно так же легко сортировать и в обратном порядке, используя функцию arsort() .

      Обе эти функции принимают те же значения сортировки, как и значения необязательного второго параметра: sort() и rsort() .

      Сортировка элементов массива по значению с помощью пользовательских функций

      С помощью разных значений вашим потребностям могут соответствовать четыре функции сортировки. Однако иногда ваши критерии сравнения элементов массива могут отличаться.

      Допустим, у вас есть массив случайных слов, которые нужно отсортировать по алфавиту. Но перед этим вы ещё хотите их отсортировать по длине. Например, в традиционной алфавитной сортировке zoo будет следовать за apple. С другой стороны, если вы хотите показать сначала короткие слова, а потом длинные, то zoo появится перед apple. В том же наборе букв, ape будет перед zoo из-за алфавитного порядка.

      В основном, слова сначала сортируются по длине, а затем слова с одинаковым количеством букв сортируются в алфавитном порядке в пределах своей группы. Этот тип сортировки не встроен в PHP, поэтому нам нужно написать собственную функцию.

      Для таких случаев PHP предоставляет вам пару функций, которые можно использовать для передачи массива, подлежащий сортировке, вместе с именем вашей собственной функции сортировки.

      Используйте функцию usort() для сортировки значений массива в обычных массивах. Точно так же можно использовать функцию uasort() для сортировки значений в ассоциативных массивах, сохраняя при этом ассоциаций ключевых значений.

      Этот фрагмент кода показывает один из способов выполнения данной сортировки.

      Как отсортировать массив в PHP тринадцатью способами: инструкция с примерами

      Становимся настоящими ниндзя в сортировке массивов. Вместо оружия — встроенные функции PHP, быстрые и точные, как катана.

      Иллюстрация: Polina Vari для Skillbox Media

      Евгений Колесников

      Евгений Колесников
      Журналист, автор канала «Тёмный Лорд Коммуникаций».

      В PHP массивом называют структуру данных, которая позволяет хранить упорядоченный набор значений по принципу ключ => значение. И количество инструментов для работы с массивами тут впечатляет: для одной только сортировки существует 13 встроенных функций! В этой статье мы покажем, как ими пользоваться, чтобы получать информацию в нужном виде.

      Способы сортировки

      Все функции PHP для сортировки массивов «конструируются» из четырёх основных критериев:

      • вид сортировки — по ключу или значениям;
      • порядок сортировки — восходящий, нисходящий, естественный, пользовательский и прочие;
      • способ обработки ключей — с сохранением связи или нет;
      • наличие уточняющих опций — в семи из этих функций можно указать предпочтительный способ сортировки и дополнительные параметры («флаги»).

      Вот функции, которые позволяют это сделать:

      У каждой из функций есть название, указывающее на вид сортировки и завершающееся круглыми скобками. Эти названия на первый взгляд кажутся не особо говорящими, поэтому для начала лучше выбирать функцию под конкретную задачу, сверяясь с табличкой на официальном сайте. При этом легко запомнить, что функции с буквой «k» сортируют массивы по ключам.

      В зависимости от выбранной функции внутри скобок указывается массив или несколько массивов для сортировки, а затем могут идти опции (флаги):

      • SORT_REGULAR — сравнивать элементы в нормальном порядке, не меняя типов;
      • SORT_NUMERIC — сравнивать элементы как числа;
      • SORT_STRING — сравнивать элементы как строки;
      • SORT_LOCALE_STRING — сравнивать элементы как строки, руководствуясь текущим местонахождением, то есть локалью (Locale);
      • SORT_NATURAL — сравнивать элементы как строки в естественном порядке;
      • SORT_FLAG_CASE — можно объединить с SORT_STRING или SORT_NATURAL, чтобы сделать сортировку нечувствительной к регистру.

      Давайте попробуем в действии отсортировать массивы разными способами. В этом нам помогут редактор кода Notepad++ и среда разработки XAMPP для запуска PHP-кода в браузере.

      Во всех примерах будем сначала выводить исходный массив, а затем его же после сортировки (помните, что сортировка меняет массив, то есть её результат сохраняется). Для удобства чтения будем осуществлять вывод с помощью привычной функции echo в связке с implode()/print_r() или циклом foreach.

      Также для красоты будем сопровождать результаты подписями (HTML-заголовки и ) и переносом строк (HTML-элемент ).

      echo "

      СОРТИРОВКА МАССИВОВ

      "
      ;

      Начало нашего кода

      Числовая сортировка: зарплаты

      Создадим массив чисел и отсортируем его в порядке убывания, от большего значения к меньшему. Возьмём самый простой пример: массив зарплат в рублях:

      $salaries = array(45000, 65000, 35000, 75000, 55000);

      Так он выглядит с выводом результата.

      echo "

      Сортировка вакансий по зарплатам

      "
      ; $salaries = array(45000, 65000, 35000, 75000, 55000); echo "

      Исходный массив вакансий по зарплатам целиком, до сортировки

      "
      ; print_r($salaries); echo "

      Массив вакансий по зарплатам до сортировки –- только значения (исходный порядок)

      "
      ; echo implode(", ", $salaries) . "
      "
      ;

      Код исходного массива зарплат с выводом результата

      Исходный массив вакансий по зарплатам целиком, до сортировки:

      Array ( [0] => 45000 [1] => 65000 [2] => 35000 [3] => 75000 [4] => 55000 )

      Массив вакансий по зарплатам до сортировки — только значения (исходный порядок):

      45000, 65000, 35000, 75000, 55000

      Как видим, сейчас зарплаты внутри массива расположены в произвольном порядке, а нам бы хотелось сначала увидеть самые выгодные вакансии. Значит, надо найти в таблице такой метод, который умеет сортировать значения в порядке убывания — нам подойдёт rsort().

      rsort($array, FLAGS);
      • rsort() — название функции, в скобках указываются параметры;
      • $array — массив для сортировки;
      • на месте опции FLAGS можно указать другие правила сортировки массива (флаги).

      А теперь попробуем нашу функцию в деле. На первом шаге передадим в неё массив с зарплатами — $salaries.

      rsort($salaries);

      Далее прописываем вывод результата:

      echo "

      Массив вакансий по зарплатам после сортировки через rsort() (по значению, по убыванию)

      "
      ; echo implode(", ", $salaries) . "
      "
      ;

      Код для сортировки массива зарплат

      Вот что у нас получилось на выходе:

      75000, 65000, 55000, 45000, 35000

      Теперь возьмёмся за массив текстовых значений.

      Текстовая сортировка: виды птиц

      По данным Большой российской энциклопедии, в мире насчитывается более двухсот видов сов. Было бы неплохо создать про них сайт, чтобы каждый мог узнать о совах побольше! Начнём с создания «массива сов», руководствуясь книгой Ю. Б. Пукинского «Жизнь сов».

      echo "

      Сортируем сов

      "
      ; $owls = array( "tytonidae" => "Сипухи", "tyto" => "Сипухи", "strigidae" => "Настоящие совы", "otus" => "Совки", "bubo" => "Филины", "ketupa" => "Рыбные совы", "nyctea" => "Белые совы", "surnia" => "Ястребиные совы", "glaucidium" => "Сычики", "ninox" => "Иглоногие совы", "athene" => "Сычи", "strix" => "Неясыти", "asfo" => "Ушастые совы", "aegolius" => "Мохноногие сычи" );

      Код исходного массива видов сов

      echo "

      Исходный массив названий видов сов целиком, до сортировки

      "
      ; print_r($owls); echo "

      Названия видов сов до сортировки -- только значения (исходный порядок)

      "
      ; echo implode(", ", $owls) . "
      "
      ;

      Код вывода исходного массива видов сов

      Исходный массив названий видов сов целиком, до сортировки:

      Array ( [tytonidae] => Сипухи [tyto] => Сипухи [strigidae] => Настоящие совы [otus] => Совки [bubo] => Филины [ketupa] => Рыбные совы [nyctea] => Белые совы [surnia] => Ястребиные совы [glaucidium] => Сычики [ninox] => Иглоногие совы [athene] => Сычи [strix] => Неясыти [asfo] => Ушастые совы [aegolius] => Мохноногие сычи )

      Названия видов сов до сортировки — только значения (исходный порядок):

      Сипухи, Сипухи, Настоящие совы, Совки, Филины, Рыбные совы, Белые совы, Ястребиные совы, Сычики, Иглоногие совы, Сычи, Неясыти, Ушастые совы, Мохноногие сычи

      В данном случае в роли ключей ассоциативного массива у нас выступают латинские названия видов, а значениями являются русские названия.

      В зависимости от задачи нам может понадобиться как латинское, так и русское название. Кроме этого, было бы интересно иметь возможность получать информацию о случайно выбранной сове, а ещё — представлять текстовые значения в алфавитном порядке.

      Отсюда вытекает необходимость использования сразу трёх различных функций сортировки:

      • ksort() для сортировки по ключам (латинским названиям) по алфавиту;
      • asort() для сортировки по значениям (русским названиям), также по алфавиту;
      • shuffle() для получения случайных русских названий сов.

      Синтаксис ksort() и asort() такой же, как и в предыдущем примере у rsort(), а с shuffle() всё ещё проще — она принимает только название массива.

      Посмотрим на функции в деле:

      ksort($owls); echo"

      Названия видов сов после сортировки через ksort() (по ключу, по алфавиту, по возрастанию)

      "
      ; print_r(array_keys($owls)); asort($owls); echo "

      Названия видов сов после сортировки через asort() (по значению, по алфавиту, по возрастанию)

      "
      ; echo implode(", ", $owls) . "
      "
      ; shuffle($owls); echo "

      Названия видов сов после сортировки через shuffle() (по значению, случайный порядок)

      "
      ; echo implode(", ", $owls) . "
      "
      ;

      Код для сортировки массива видов сов

      Названия видов сов после сортировки через ksort() (по ключу, по алфавиту, по возрастанию):

      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 )

      Названия видов сов после сортировки через asort() (по значению, по алфавиту, по возрастанию):

      Белые совы, Иглоногие совы, Мохноногие сычи, Настоящие совы, Неясыти, Рыбные совы, Сипухи, Сипухи, Совки, Сычи, Сычики, Ушастые совы, Филины, Ястребиные совы

      Названия видов сов после сортировки через shuffle() (по значению, случайный порядок):

      Сипухи, Рыбные совы, Белые совы, Сычики, Совки, Сипухи, Мохноногие сычи, Ястребиные совы, Ушастые совы, Филины, Неясыти, Настоящие совы, Иглоногие совы, Сычи

      Совы встали на свои места, а мы двигаемся дальше — к сортировке, имитирующей человеческую логику.

      Естественная сортировка: страницы во «ВКонтакте»

      Предположим, у нас есть список подписчиков нашей группы в одном из возможных форматов — ссылками с id вида vk.com/idXXX.

      echo "

      Сортируем ссылки на страницы во «Вконтакте» через natsort()

      "
      ; $pages = array("vk.com/id30000", "vk.com/id10000", "vk.com/id20000"); echo "

      Исходный массив ссылок на страницы во «Вконтакте», до сортировки

      "
      ; print_r($pages);

      Код исходного массива страниц во «Вконтакте» с выводом результата

      Исходный массив ссылок на страницы во «Вконтакте», до сортировки:

      Array ( [0] => vk.com/id30000 [1] => vk.com/id10000 [2] => vk.com/id20000 )

      Было бы удобно расположить записи в порядке возрастания id, но есть нюанс: элементы массива являются строковыми значениями. Вот что показывает проверка типов:

      echo "

      Проверка типа данных в массиве ссылок на страницы во «Вконтакте»

      "
      ; foreach ($pages as $page) < echo gettype($page) . "
      "
      ; >;

      Вывод результата после проверки типа данных в массиве ссылок на страницы во «Вконтакте»:

      string string string

      Чтобы решить задачу, воспользуемся функцией естественной сортировки natsort().

      natsort($array);
      • natsort() — название функции, в скобках указывается единственный параметр;
      • $array — массив, который нужно отсортировать естественным способом (как это бы сделал человек).

      Посмотрим на функцию в деле:

      natsort($pages); echo "

      Массив ссылок на страницы во «Вконтакте» после естественной сортировки через natsort() (по значению, по возрастанию)

      "
      ; echo implode(", ", $pages) . "
      "
      ;

      Массив ссылок на страницы во «Вконтакте» после естественной сортировки через natsort() (по значению, по возрастанию):

      vk.com/id10000, vk.com/id20000, vk.com/id30000

      Теперь страницы отсортированы в удобном для работы формате.

      Сортировка многомерного массива: цены на топливо

      Для примера возьмём двумерный массив, состоящий, в свою очередь, из двух массивов: марок автомобильного топлива и цен на него некоторое время назад.

      echo "

      Сортируем цены на бензин и дизельное топливо (в рублях) через array_multisort()

      "
      ; $petrol = array( array("52,75", "61,95", "54,01", "47,60"), array("АИ-95", "АИ-98", "ДТ", "АИ-92") ); echo "

      Марки топлива и цены на него до сортировки(исходный порядок)

      "
      ; print_r(array_values($petrol));

      Код исходного массива цен на топливо с выводом результата

      Марки топлива и цены на него до сортировки (исходный порядок):

      Array ( [0] => Array ( [0] => 52,75 [1] => 61,95 [2] => 54,01 [3] => 47,60 ) [1] => Array ( [0] => АИ-95 [1] => АИ-98 [2] => ДТ [3] => АИ-92 ) )

      Сейчас здесь есть взаимное соответствие (например, АИ-92 стоит 47,60), но сами значения не отсортированы в каком-либо порядке. Попробуем с помощью функции сортировки array_multisort() вывести для пользователя список ценников, отсортированный по возрастанию, где сначала идёт самый дешёвый бензин.

      Функция array_multisort() предназначена как раз для сортировки многомерных массивов. Вот её синтаксис:

      array_multisort($array1, $array1_sort_order, $array1_sort_flags, $other);
      • array_multisort() — название функции, в скобках указываются параметры;
      • $array1 — первый массив для сортировки;
      • на месте опции $array1_sort_order можно указать порядок сортировки первого массива (можно не указывать);
      • на месте опции $array1_sort_flags можно указать другие правила сортировки первого массива (флаги) в дополнение к предыдущей опции;
      • на месте $other можно вписать ещё один массив $array2 с опциями или без (и так далее).

      Применим функцию в деле:

      echo("

      Сортировка марок топлива и цен через array_multisort() (по возрастанию)

      "
      ); array_multisort($petrol[0], $petrol[1]); echo implode(" -- ", $petrol[1]) . "
      "
      ; echo implode(" -- ", $petrol[0]) . "
      "
      ;

      Вывод отсортированного массива марок топлива и цен через array_multisort() (по возрастанию):

      АИ-92 -- АИ-95 -- ДТ -- АИ-98 47,60--52,75--54,01--61,95

      Теперь марки топлива расположены по возрастанию цены, а мы возьмём ещё более интересный пример — сортировку по кастомным правилам.

      Пользовательская сортировка: сотрудники компании

      Предположим, у нашей компании есть корпоративный портал, где можно посмотреть информацию о коллегах. Пусть у нас в массиве будет шесть коллег. База содержит ФИО, внутренний ID, должность и возраст, а карточка каждого сотрудника является отдельным массивом многомерного массива:

      echo "

      Сортируем сотрудников компании

      "
      ; $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" ) );

      Код вывода исходного массива карточек сотрудников компании:

      echo "

      Записи сотрудников компании до сортировки(исходный порядок)

      "
      ; print_r(array_values($employees));

      Вывод исходного массива карточек сотрудников компании до сортировки (исходный порядок):

      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 ) )

      Дадим пользователю корпоративного портала возможность сортировки списка по фамилиям, возрасту и порядковому номеру. В этом нам поможет функция пользовательской сортировки usort().

      usort($array, "function");
      • usort() — название функции, в скобках указываются параметры.
      • $array — массив для сортировки.
      • «function» — название вашей функции сравнения с собственными правилами сортировки. Она объявляется заранее и принимает два параметра. Обратите внимание на кавычки, в которые заключается название.

      Применим функцию в деле — на сортировке сотрудников по алфавиту, по возрасту (по возрастанию) и по ID (по убыванию).

      • В каждом из трёх примеров ниже мы сначала объявляем пользовательскую функцию сравнения (alphSort, ageSort и idSort соответственно), а потом передаём её встроенной функции usort() в качестве обработчика массива.
      • Цикл foreach помогает по очереди перебирать карточки каждого сотрудника в главном массиве $employees. Для удобства мы в рамках цикла обзываем их $employee — то же самое английское слово в единственном числе.
      • Для доступа к нужным ключам вложенных массивов (карточек сотрудников) используется синтаксис с квадратными скобками: $array[«key»] и так далее.
      echo "

      Сортировка сотрудников по ФИО через usort() и strcmp (по алфавиту)

      "
      ; function alphSort($name1, $name2) < return strcmp($name1["ФИО"], $name2["ФИО"]); >; usort($employees, "alphSort"); foreach ($employees as $employee) < echo "ID " . $employee["ID"] . ", " . "ФИО: " . $employee["ФИО"] . ", " . "Должность: " . $employee["Должность"] . ", " . "Возраст: " . $employee["Возраст"] . "
      "
      ; >;

      Функция alphSort() принимает по два значения ФИО ($name1 и $name2) и сравнивает их как строки с помощью встроенной функции strcmp(). Она передаётся во встроенную функцию usort(), где и применяется на нашем массиве.

      Вывод отсортированного массива карточек сотрудников компании. Вариант первый — ФИО по алфавиту:

      ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40 ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26 

      Следующие два примера строятся по похожему принципу. Вот код для сортировки массива карточек сотрудников компании. Вариант второй — по возрасту.

      echo "

      Сортировка сотрудников по возрасту через usort() (по возрастанию)

      "
      ; 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["Должность"] . ", " . "Возраст: " . $employee["Возраст"] . "
      "; >;

      Функция ageSort() должна сравнивать по два значения возраста сотрудников (в данном примере — $age1, $age2), и возвращать результат (отсортированный массив) в зависимости от результата сравнения. Она также передаётся во встроенную функцию usort().

      Вывод отсортированного массива карточек сотрудников компании. Вариант второй — по возрасту:

      ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40 

      Код для сортировки массива карточек сотрудников компании. Вариант третий — по ID:

      echo "

      Сортировка сотрудников по ID через usort() (по убыванию)

      "
      ; 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 "ID " . $employee["ID"] . ", " . "ФИО: " . $employee["ФИО"] . ", " . "Должность: " . $employee["Должность"] . ", " . "Возраст: " . $employee["Возраст"] . "
      "
      ; >; ?>

      Аналогично прошлому примеру, здесь функция idSort() тоже заточена на сравнение по двум значениям — теперь это ID сотрудников ($id1, $id2) — и возвращает результат (отсортированный массив) в зависимости от результата сравнения.

      Вывод отсортированного массива карточек сотрудников компании. Вариант третий — по ID:

      ID6, ФИО: Совакошка Мария Игоревна, Должность: Старший инженер, Возраст: 26 ID 5, ФИО: Голохрюхин Евгений Владимирович, Должность: Директор, Возраст: 40 ID 4, ФИО: Бокакин Арсений Брониславович, Должность: Менеджер, Возраст: 31 ID 3, ФИО: Охрюненко Борис Гориславович, Должность: Курьер, Возраст: 22 ID 2, ФИО: Ахрюнов Алексей Степанович, Должность: Бухгалтер, Возраст: 32 ID 1, ФИО: Вувузела Андрей Павлович, Должность: Менеджер, Возраст: 29 

      Итоги

      Мы рассмотрели основные виды сортировок массивов в PHP: числовую, алфавитную, естественную, многомерную и пользовательскую. Для всего этого мы нашли подходящие функции.

      Для более детального знакомства с функциями сортировки массивов в PHP рекомендуем пользоваться таблицами-напоминалками: в разных руководствах они сделаны по-разному, поэтому лучше найти ту табличку, которая будет удобна именно вам. А для синтаксически правильного применения советуем пользоваться официальной документацией языка, тем более она переведена на русский.

      Читайте также:

      • Уход Никиты Попова и создание PHP Foundation: что станет с PHP?
      • Антивирус Бабушкина, «Куку-AU» и другие чудеса российского чебурнета
      • PHP for dummies: как устроена экосистема языка и почему его стоит изучать в 2021 году

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

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