Как отсортировать массив ассоциативных массивов по значению заданного ключа в php?

Функции сортировки массива php

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

Для того, чтобы произвести сортировку массива php с помощью какой-то конкретной функции, нужно будет вызвать её после объявления массива и заполнения его значениями, указав ей в качестве параметров наш массив. Например:

$cars = array('Toyota', 'Mazda', 'Mitsubishi');
sort($cars);

Рассмотрим вкратце функционал каждой из них. Функции будут указаны в том формате, в котором их нужно будет вызывать в коде, т.е. «название(параметр1, параметр2, …);».

Не забудьте после вызова функции поставить «;», т.к. без неё на экране появится красивое сообщение об ошибке

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

Array (
    => 11

    => 18

    => 9
)

Итак, как же можно произвести сортировку массива в нужном порядке на php?

Сортировка ассоциативных массивов: asort() and arsort()

sort() и rsort() очень хороши для индексированных массивов, где не нужно волноваться о связи ключа и значения. Могут получится неожиданности) Например:

 $movie = array( "title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112 ); sort( $movie ); // Отобразит "Array (  => Alfred Hitchcock  => Rear Window  => 112  => 1954 )" print_r( $movie ); 

Видно, что произошла путаница, и оригинальная структура «title», «director», «year» and «minutes» поменялась.

Если же вы хотите сортировать ассоциативный массив по первичному ключу, используйте функции asort() и arsort() Эти функции учитывают связь ключей и их значений

За возрастающий порядок сортировки отвечает функция asort():

 $movie = array( "title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112 ); asort( $movie ); // Отображает "Array (  => Alfred Hitchcock  => Rear Window  => 112  => 1954 )" print_r( $movie ); 

arsort() наоборот:

 $movie = array( "title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112 ); arsort( $movie ); // Отображает "Array (  => 1954  => 112  => Rear Window  => Alfred Hitchcock )" print_r( $movie ); 

Оператор безопасного null (Nullsafe operator)

Null — сам по себе не очень хорошая штука (даже очень плохая). Когда функция возвращает , то в каждом месте, где идёт её вызов, программист обязан проверить на . И это приводит к ужасным последствиям.

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

Более правильный вариант:

Интересным моментом в использовании nullsafe есть то, что при вызове метода с помощью , параметры будут обработаны только если объект не :

Сортировка сложных и многомерных массивов с array_multisort()

Очень мощная функция array_multisort() может сортировать многомерный массив, сохраняя связь между массивами. Вобщем, сейчас всё увидим:

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

Сортируем, используя array_multisort(), просто указываем те массивы, которые нужно обратотать:

 $directors = array( "Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese" ); $titles = array( "Full Metal Jacket", "Rear Window", "Mean Streets" ); $years = array( 1987, 1954, 1973 ); array_multisort( $directors, $titles, $years ); print_r( $directors ); echo "<br />"; print_r( $titles ); echo "<br />"; print_r( $years ); echo "<br />"; 

Этот код отобразит: Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick ) Array ( => Rear Window => Mean Streets => Full Metal Jacket ) Array ( => 1954 => 1973 => 1987 ) Сначала array_multisort() сортирует значения в $directors в возрастающем порядке, затем 2 остальных так же.

А что если мы хотим сортировать, например, чтобы вначале «title»? Просто положите $titles вперёд списка:

 array_multisort( $titles, $directors, $years ); 

Сортировка по… далее…

Если первый массив содержит какое-то количество id-номеров, тогда array_multisort() сортирует по этим значениям первый массив, затем — второй, и тд. Пример:

 $directors = array( "Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese", "Stanley Kubrick" ); $titles = array( "Full Metal Jacket", "Rear Window", "Mean Streets", "A Clockwork Orange" ); $years = array( 1987, 1954, 1973, 1971 ); array_multisort( $directors, $titles, $years ); print_r( $directors ); echo "<br />"; print_r( $titles ); echo "<br />"; print_r( $years ); echo "<br />"; 

Этот код выдаёт следующее — заметьте, что «A Clockwork Orange» перед «Full Metal Jacket»: Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick => Stanley Kubrick ) Array ( => Rear Window => Mean Streets => A Clockwork Orange => Full Metal Jacket ) Array ( => 1954 => 1973 => 1971 => 1987 )

Объединения типов (Union Types 2.0)

Рассмотрим код:

Здесь тип переменной контролируется только соглашениями программистов. На самом деле, туда может попасть что-угодно, и выйти отсюда может также что-угодно, так как проверки на тип не обеспечиваются ядром языка.

Теперь же, можно прописать тип (или любой другой) явно, чтобы обеспечить корректность работы модуля:

А также, код становится немного чище, так как мы можем избавится от излишних комментариев.

Типы-объединения имеют синтаксис и могут быть использованы во всех местах, где можно прописать type-hints с некоторыми оговорками:

  • Тип не может быть частью объединения.
  • Чтобы обозначить отсутствие результата, можно объявить «Nullable union type», который имеет следующий синтаксис: .
  • Тип не может быть использован вне объединения. Вместо него стоит использовать .
  • Существует также псевдотип , который по историческим причинам уже используется некоторыми функциями в php. С другой стороны, не существует тип , так как он нигде не использовался ранее.

Типы полей класса инвариантны, и не могут быть изменены при наследовании.
А вот с методами всё немного интересней:

  1. Параметры методов можно расширить, но нельзя сузить.
  2. Возвращаемые типы можно сузить, но нельзя расширить.

Вот как это выглядит в коде:

То же самое происходит при типах, которые получились как результат наследования:

Интереснее становится когда установлен в , то-есть по-умолчанию. Например, функция принимает , а мы передали ей . Что в результате должно быть в переменной? Пустая строка, или ноль? Есть набор правил, по которым будет производиться приведение типов.

Так, если переданный тип не является частью объединения, то действуют следующие приоритеты:

  1. int;
  2. float;
  3. string;
  4. bool;

Так вот, будет перебираться этот список с типами, и для каждого проверяться: Если тип существует в объединении, и значение может быть приведёно к нему в соответствии с семантикой PHP, то так и будет сделано. Иначе пробуем следующий тип.

Как исключение, если должен быть приведён к , то сравнение идёт в первую очередь в соответствии с семантикой «числовых строк». К примеру, станет , в то время как станет .

Таблица неявного приведения типов:

Original type 1st try 2nd try 3rd try

Типы полей и ссылки

Здесь проблема в том, что тип устанавливаемого значения не совместим с объявленными в полях класса. Для — это могло быть , а для — . Так как эти значения не эквивалентны, то невозможно обеспечить единую ссылку, и будет сгенерирован.

Сортируем массивы-списки в алфавитном и обратном порядке

Для начала давайте познакомимся с достаточно простой и понятной функцией sort().

Она позволит нам отсортировать элементы массива по возрастанию или, если эти элементы строковые – в алфавитном порядке.

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

<?
$Mass = array('Катя', 'Аня', 'Лена','Андрей');
sort($Mass);
print_r($Mass);
?>

А результат будет следующим. Как Вы можете видеть на скриншоте справа, элементы отсортированы в алфавитном порядке. Если вместо строковых элементов у нас будут числа, то эта функция также отсортирует числа по возрастанию. Можете проверить это самостоятельно.

Также существует и функция, которая делает обратное действие, то есть сортирует элементы массива по убыванию или в порядке обратном алфавитному.

Эта функция называется rsort(). Работает она следующим образом:

<?
$Mass = array('Катя', 'Аня', 'Лена','Андрей');
rsort($Mass);
print_r($Mass);
?>

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

Думаю, что с этими функциями все предельно ясно. Протестируйте их со своими массивами и у Вас не останется никаких вопросов.

Функции PHP для сортировки массивов

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

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

  • sort() и rsort() — для сортировки индексированных массивов
  • asort() и arsort() — для сортировки ассоциативных массивов по значению
  • ksort() и krsort() — для сортировки ассоциативных массивов по ключам

Пользовательская сортировка

Также мы можем задать и свои порядок сортировки, то есть создать пользовательскую сортировку.

Для этого также в php предусмотрены специальные функции.

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

Она будет принимать два аргумента. Первый аргумент – это наш массив; второй аргумент – будет содержать имя функции, сравнивающей два элемента.

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

1 – если первый элемент сравнения больше второго;

-1 – если второй больше первого;

0 – если элементы равны.

Таким образом мы, например, можем отсортировать элементы массива по возрастанию их длины.

Для этого сначала объявим сам массив, который будет содержать строковые элементы различной длины.

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

После этого воспользуемся функцией для пользовательской сортировки usort(). Ей передадим в качестве аргументов: имя нашего массива и имя функции, которую мы создали для сравнения элементов.

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

<?
$Mass = array('Андрей', 'Яна', 'Катя');
function check_length($str1,$str2){
$length1 = strlen($str1);
$length2 = strlen($str2);
if($length1 == $length2):
return 0;
elseif($length1 < $length2):
return -1;
else:
return 1;
endif;	
}
usort($Mass,"check_length");
print_r($Mass);
?>

Получим мы следующий результат. Элементы нашего массива отсортированы в порядке увеличения их длины.

Также мы можем сделать пользовательскую сортировку ассоциативного массива по его ключам. Для этого нам понадобится функция uksort() и сам ассоциативный массив.

Давайте оставим пользовательскую функцию той же, то есть сравниваем длину ключей.

<?
$Mass='яна';
$Mass='андрей';
$Mass='катя';
function check_length($str1,$str2){
$length1 = strlen($str1);
$length2 = strlen($str2);
if($length1 == $length2):
return 0;
elseif($length1 < $length2):
return -1;
else:
return 1;
endif;	
}
uksort($Mass,"check_length");
print_r($Mass);
?>

Ключи элементов массива отсортированы по возрастанию их длины.

И также мы можем создать пользовательскую сортировку ассоциативного массива по значениям его элементов. В этом нам поможет функция uasort().

Принцип все тот же.

<?
$Mass='яна';
$Mass='андрей';
$Mass='катя';
function check_length($str1,$str2){
$length1 = strlen($str1);
$length2 = strlen($str2);
if($length1 == $length2):
return 0;
elseif($length1 < $length2):
return -1;
else:
return 1;
endif;	
}
uasort($Mass,"check_length");
print_r($Mass);
?>

Теперь массив отсортирован по увеличению длин его значений.

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

Чтобы хорошенько понять, как работает пользовательская сортировка, нужно попрактиковаться и попробовать написать какую-то свою функцию сравнения.

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

Практикуйтесь, пишите Ваши комментарии и делитесь статьей с друзьями при помощи кнопок социальных сетей.

Если Вы еще не подписаны на обновления блога, то подписывайтесь. Форма подписки находится ниже.

С Вами была Анна Котельникова. До встречи в следующих статьях.

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

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

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

Давайте начнем с сортировки по значениям.

Для того, чтобы отсортировать значения ассоциативного массива в алфавитном порядке, мы применим функцию asort().

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

<?
$Mass='Катя';
$Mass='Борис';
$Mass='Аня';
$Mass='Рита';
asort($Mass);
print_r($Mass);
?>

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

Таким же образом работает, и функция arsort(), за тем исключением, что она сортирует значения ассоциативного массива в обратном порядке.

<?
$Mass='Катя';
$Mass='Борис';
$Mass='Аня';
$Mass='Рита';
arsort($Mass);
print_r($Mass);
?>

Здесь опять же мы можем видеть, что значения элементов массива сохраняют свою связь с ключами, но отсортированы в обратном порядке.

Тот же самый ассоциативный массив мы можем отсортировать и по ключам.

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

Для того, чтобы сортировать массив по ключам в алфавитном порядке, нам понадобится функция ksort().

<?
$Mass='Катя';
$Mass='Борис';
$Mass='Аня';
$Mass='Рита';
ksort($Mass);
print_r($Mass);
?>

Массив отсортирован по ключам в алфавитном порядке.

Для того, чтобы отсортировать массив по его ключам в обратном порядке, применяется функция krsort().

<?
$Mass='Катя';
$Mass='Борис';
$Mass='Аня';
$Mass='Рита';
krsort($Mass);
print_r($Mass);
?>

Думаю, что из скриншота все понятно.

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

Функция sort() используется для сортировки элементов индексированного массива в порядке возрастания (в алфавитном порядке для букв).

<?php
// Создание массива
$colors = array("Red", "Green", "Blue", "Yellow");

// Сортировка и вывод значений
sort($colors);
print_r($colors);
?>

В результате будет выведено следующее:

Array (  => Blue  => Green  => Red  => Yellow )

Аналогично вы можете отсортировать числовые элементы массива в порядке возрастания.

<?php
// Создание массива
$numbers = array(1, 2, 2.5, 4, 7, 10);

// Сортировка и вывод массива
sort($numbers);
print_r($numbers);
?>

Результат работы функции сортировки

Array (  => 1  => 2  => 2.5  => 4  => 7  => 10 )

Функции простой сортировка массива php по значению

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

Если после него у вас остались вопросы, то более подробную информацию по каждой функции вы можете найти ниже.

sort($array, $flag); — одна из самых простых и востребованных функций. Позволяет отсортировать массив по возрастанию на php с учетом значений элементов, т.е. они будут расположены от меньшего значения к большему. В качестве параметров принимает переменную массива и один из флагов сортировки, который позволяет изменить поведение сортировки.

Список флагов:

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

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

Наш тестовый массив после вызова функции sort() будет выглядеть следующим образом:


Array (
    => 9

    => 11

    => 18
)

Как видите, после сортировки массива по значениям, значения их ключей также поменялись, т.к. sort работает без сохранения связи «ключ-значение», о чём говорится в официальной документации php.

В итоге, данный вариант подойдёт для подавляющего большинства случаев.

rsort($array, $flag); — функция, являющаяся антагонистом sort. Антагонистом, потому что она производит сортировку массива таким же образом, только не по возрастанию, а по убыванию, т.е. первыми будут идти элементы массива php с самыми большими значениями.

В неё можно также передавать два параметра: сам массив и флаг сортировки и она, как и sort, больше подходит для одномерных массивов. Наш тестовый массив после вызова данной функции примет следующий вид:


Array (
    => 18

    => 11

    => 9
)

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

За тем лишь исключением, что она позволяет производить сортировку массива php по значению его элементов с сохранением связи «ключ — значение».

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

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

Также можно передавать два параметра. Наш тестовый массив примет следующий вид:


Array (
    => 9

    => 11

    => 18
)

Как видите, отличие от sort только в сохранении ключей у значений, по которым происходит сортировка массива php. Это и называется сохранением связи «ключ-значение», которая невероятно важна при сортировке ассоциативных массивов php.

arsort($array, $flag); — еще одна функция php для сортировки массива по значению. Антагонист asort.

Работает по тому же принципу, что и упомянутая функция, только сортировка массива php в данном случае будет по убыванию. Также является отличным вариантом при сортировке ассоциативных массивов php.

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


Array (
    => 18

    => 11

    => 9
)

Немного теории о массивах php

PHP – это серверный язык программирования. Серверный, потому что скрипты, которые запускаются пользователями через веб-интерфейс (Интернет-браузер), хранятся и выполняются на сервере.

PHP-скрипты скрыты от взора обычного пользователя. В окне ваших браузеров вы видите только результаты их выполнения.

Массив в программировании – это совокупность каких-то данных. Состоят они из элементов массива, которые представляют собой пары => .

Массивы бывают статические, динамические, гетерогенные и т.д. (целая наука) Нам же для работы с ними вполне хватит классификации на одномерные и многомерные.

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

Одномерый массив php:

Array (
    => 1

    => 2

    => 3
)

Многомерный массив php:


Array
(
    => Array (
        => 1
   )

    => Array (
        => 2
   )

    => Array (
        => 3
   )
)

Заметили? Если нет – обратите внимание на элементы многомерного массива php. Они сами являются массивами

Т.е. многомерный массив – это совокупность массивов. Уровень их вложенности может быть сколько угодно большим.

Теперь, думаю, точно понятно

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

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

Примером ассоциативного массива может служить следующая конструкция:


Array (
    => 12

    => Иванов Иван Иванович

    => 3
)

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

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

В самом php массивы создаются двумя способами:

  1. $books = array(‘Азбука’, ‘Букварь’, ‘Словарь); или $books = array(‘azb’ => ‘Азбука’, ‘buk’ => ‘Букварь’, ‘slov’ => ‘Словарь’); Второй вариант используется, когда элементу нужно явно указать ключевое поле (актуально для ассоциативных массивов). Если его не указать, по умолчанию ключи элементов массива будут числами. Начиная с 0 (нуля).
  2. $books = ‘Азбука’; $books = ‘Букварь’; $books = ‘Букварь’;

В обоих случаях $books будет являться массивом. Так что, если вы встретите в коде своего сайта такие конструкции, это уже не будет для вас чем-то непонятным

Если вы хотите узнать о массивах php более подробно, то рекомендую вашему вниманию следующее видео:

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


echo '<pre>'; print_r(переменная_массива); die();

Если распечатываемая вами переменная будет являться массивом, то текст будет начинаться со следующей строки:


Array (
…

И ещё несколько слов о теме нашей статьи – сортировке массивов php.

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

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

Переходим к обзору самих функций.

Сортировка проиндексированных массивов в порядке убывания

Функция rsort() используется для сортировки элементов индексированного массива в порядке убывания (в алфавитном порядке для букв).

<?php
// Создание массива
$colors = array("Red", "Green", "Blue", "Yellow");

// Сортировка и вывод массива
rsort($colors);
print_r($colors);
?>

Результат:

Array (  => Yellow  => Red  => Green  => Blue )

Точно так же вы можете отсортировать числовые элементы массива в порядке убывания.

<?php
// Создание массива
$numbers = array(1, 2, 2.5, 4, 7, 10);

// Сортировка и вывод массива
rsort($numbers);
print_r($numbers);
?>

Результат:

Array (  => 10  => 7  => 4  => 2.5  => 2  => 1 )

Сортировка массива по ключу

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

Вот основной пример сортировки:

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

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

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

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

Adblock
detector