Php sorting arrays
Содержание:
Немного теории о массивах php
PHP – это серверный язык программирования. Серверный, потому что скрипты, которые запускаются пользователями через веб-интерфейс (Интернет-браузер), хранятся и выполняются на сервере.
PHP-скрипты скрыты от взора обычного пользователя. В окне ваших браузеров вы видите только результаты их выполнения.
Массив в программировании – это совокупность каких-то данных. Состоят они из элементов массива, которые представляют собой пары => .
Массивы бывают статические, динамические, гетерогенные и т.д. (целая наука) Нам же для работы с ними вполне хватит классификации на одномерные и многомерные.
Для того, чтобы вы поняли разницу между ними, достаточно привести описание их структуры.
Одномерый массив php:
Array ( => 1 => 2 => 3 )
Многомерный массив php:
Array ( => Array ( => 1 ) => Array ( => 2 ) => Array ( => 3 ) )
Заметили? Если нет – обратите внимание на элементы многомерного массива php. Они сами являются массивами
Т.е. многомерный массив – это совокупность массивов. Уровень их вложенности может быть сколько угодно большим.
Теперь, думаю, точно понятно
Также ещё хотелось бы отдельно выделить понятие ассоциативного массива php. В реальной жизни они не так распространены, как обычные, но всё же имеют место быть.
Вкратце, это такие массивы, у которых ключ и значение элемента массива неразрывно связаны и между ними прослеживается некая логическая связь, которую ни в коем случае нельзя разрывать.
Примером ассоциативного массива может служить следующая конструкция:
Array ( => 12 => Иванов Иван Иванович => 3 )
Как видите, здесь значения ключей и значений элементов массива тесно связаны и ни в коем случае нельзя разрывать эту связь. Благодаря этому ассоциативные массивы очень часто называют «словарями» или «справочниками».
Поэтому данную особенность нужно обязательно учитывать при сортировке массива php, т.к. для таких структур подойдут не все методы.
В самом php массивы создаются двумя способами:
- $books = array(‘Азбука’, ‘Букварь’, ‘Словарь); или $books = array(‘azb’ => ‘Азбука’, ‘buk’ => ‘Букварь’, ‘slov’ => ‘Словарь’); Второй вариант используется, когда элементу нужно явно указать ключевое поле (актуально для ассоциативных массивов). Если его не указать, по умолчанию ключи элементов массива будут числами. Начиная с 0 (нуля).
- $books = ‘Азбука’; $books = ‘Букварь’; $books = ‘Букварь’;
В обоих случаях $books будет являться массивом. Так что, если вы встретите в коде своего сайта такие конструкции, это уже не будет для вас чем-то непонятным
Если вы хотите узнать о массивах php более подробно, то рекомендую вашему вниманию следующее видео:
Напомню, что для того, чтобы увидеть структуру массива у себя на экране, после объявления массива в коде сайта необходимо прописать следующую конструкцию:
echo '<pre>'; print_r(переменная_массива); die();
Если распечатываемая вами переменная будет являться массивом, то текст будет начинаться со следующей строки:
Array ( …
И ещё несколько слов о теме нашей статьи – сортировке массивов php.
Как вы могли понять, данные в массивах структурированы и элементы расположены в определённой последовательности. Для того, чтобы изменить её, нам как раз и понадобится сортировка массива php, которая реализована готовыми функциями языка.
Поэтому всё, что нам нужно сделать – это вызвать требуемую функцию после объявления массива, указав его в качестве параметра.
Переходим к обзору самих функций.
Меняем порядок сортировки
Вы можете пропустить (опционально) flag-аргумент после аргумента массива чтобы менять порядок сортировки:
SORT_ASC сортировка по возрастаниюSORT_DESC сортировка по убыванию
Тут сортируем $directors по возрастанию, затем $titles по убыванию:
$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, SORT_ASC, $titles, SORT_DESC, $years ); print_r( $directors ); echo "<br />"; print_r( $titles ); echo "<br />"; print_r( $years ); echo "<br />";
Вот что вышло: заметьте, что «Full Metal Jacket» теперь перед «A Clockwork Orange»:
Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick => Stanley Kubrick ) Array ( => Rear Window => Mean Streets => Full Metal Jacket => A Clockwork Orange ) Array ( => 1954 => 1973 => 1987 => 1971 )
Сортировка многомерных массивов
Сортировка через array_multisort() проходит по первому элементу каждого массива. Если 2 значения одинаковы, сортирвка идёт по 2у элементу и тп.
Это пример, который показывает, как это работает Сортировка идет по director, потом по title, потом по year:
$movies = array( array( "director" => "Alfred Hitchcock", "title" => "Rear Window", "year" => 1954 ), array( "director" => "Stanley Kubrick", "title" => "Full Metal Jacket", "year" => 1987 ), array( "director" => "Martin Scorsese", "title" => "Mean Streets", "year" => 1973 ), array( "director" => "Stanley Kubrick", "title" => "A Clockwork Orange", "year" => 1971 ) ); array_multisort( $movies ); echo "<pre>"; print_r( $movies ); echo "</pre>";
Результат:
Array ( => Array ( => Alfred Hitchcock => Rear Window => 1954 )
=> Array ( => Martin Scorsese => Mean Streets => 1973 )
=> Array ( => Stanley Kubrick => A Clockwork Orange => 1971 )
=> Array ( => Stanley Kubrick => Full Metal Jacket => 1987 )
Как видите, array_multisort() отсортирвал массив по director. Когда имя режиссёра повторилось, («Stanley Kubrick»), сортировка пошла по title.
Чтобы отсортровать в обратном порядке, укажите SORT_DESC-флаг как второй аргумент array_multisort(). Просто!
Итог
В этом уроке мы посмотрели на простые PHP-функции для сортровки массива:
* sort() и rsort() для сортровки индексируемых массивов * asort() и arsort() для сортровки асоциативных массивов * ksort() и krsort() для сортровки ассоциативнх массивов по ключу * array_multisort() для сортировки для сортировки сложных и многомерных массивов
______________
Наткнулся тут на интересный блог – блог про блоги так сказать) Автор обзоры делает)
Naikom » Кодинг » PHP
Функции простой сортировка массива 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 )
Операции с массивами
Последнее обновление: 1.11.2015
Функция is_array
Функция проверяет, является ли переменная массивом, и если является, то возвращает , иначе возвращает
. Например:
$isar = is_array($technics); echo ($isar==true)?"это массив":"это не массив";
Функции count/sizeof
Функция и получают количество элементов массива:
$number = count($technics); // то же самое, что // $number = sizeof($technics); echo "В массиве technics $number элементов";
Функции shuffle
Функция перемешивает элементы массивы случайным образом:
$os = array("Windows 95", "Windows XP", "Windows Vista", "Windows 7", "Windows 8", "Windows 10"); shuffle($os); print_r($os); // один из возможных вариантов // Array ( => Windows 95 => Windows 7 => Windows Vista => Windows XP => Windows 10 => Windows 8)
Функции compact
Функция позволяет создать из набора переменных ассоциативный массив, где ключами будут сами имена переменных:
<?php $model = "Apple II"; $producer = "Apple"; $year = 1978; $data = compact('model', 'producer', 'year'); print_r($data); // получится следующий вывод // Array ( => Apple II => Apple => 1978 ) ?>
Функция compact получает в скобках набор переменных. Каждая переменная указывается в кавычка без знака $. Результатом функции является новый массив.
Сортировка массивов
В PHP имеются два типа сортировки: сортировка строк по алфавиту и сортировка чисел по возрастанию/убыванию. Если сортируемые значения представляют строки,
то они сортируются по алфавиту, если числа — то они сортируются в порядке возрастания чисел. PHP по умолчанию самостоятельно выбирает тип сортировки.
Для сортировки по возрастанию используется функция asort:
<?php $tablets = array("lenovo" => "Lenovo IdeaTab A3500", "samsung" => "Samsung Galaxy Tab 4", "apple" => "Apple iPad Air"); asort($tablets); echo "<ul>"; foreach ($tablets as $key => $value) { echo "<li>$key : $value</li>"; } echo "</ul>"; ?>
В данном случае значения массива представляют строки, поэтому PHP выберет сортировку по алфавиту. Однако с помощью дополнительного параметра мы можем явно указать
интерпретатору PHP тип сортировки. Данный параметр может принимать три значения:
-
: автоматический выбор сортировки
-
: числовая сортировка
-
: сортировка по алфавиту
Укажем явно тип сортировки:
asort($tablets, SORT_STRING);
Чтобы отсортировать массив в обратном порядке, применяется функция arsort:
arsort($tablets);
Сортировка по ключам
Функция производит сортировку по значениям элементов, но также существует и еще и сортировка по ключам. Она представлена функцией
ksort:
ksort($tablets, SORT_STRING);
Сортировка по ключам в обратном порядке выполняется функцией krsort():
krsort($tablets);
Естественная сортировка
Хотя выше описанные функции сортировки прекрасно выполняют свою работу, но их возможностей все-таки недостаточно. Например, отсортируем по возрастанию следующий массив:
<?php $os = array("Windows 7", "Windows 8", "Windows 10"); asort($os); print_r($os); // результат // Array ( => Windows 10 => Windows 7 => Windows 8 ) ?>
Так как значения представляют строки, то PHP сортирует по алфавиту. Однако подобная сортировка не учитывает числа и регистр. Поэтому значение
«Windows 10» будет идти в самом начале, а не в конце, как должно было быть. И для решения этой проблемы в PHP есть функция natsort(),
которая выполняет естественную сортировку:
<?php $os = array("Windows 7", "Windows 8", "Windows 10"); natsort($os); print_r($os); // результат // Array ( => Windows 7 => Windows 8 => Windows 10) ?>
Если нам надо еще при этом, чтобы сортировка не учитывала регистр, то мы можем применить функцию natcasesort():
natcasesort($os);
НазадВперед
Сортировка многомерных массивов в PHP
В реальных проектах чаще всего имеют дело с многомерной информацией. Например, учебные заведения будут хранить оценки по разным предметам всех учащихся в одной таблице вместо создания новых таблиц для каждого предмета. Если вам понадобилось бы хранить похожую информацию в PHP, вы тоже предпочли использовать данный подход,а именно многомерный массив вместо отдельного массива для каждого предмета.
В этом уроке мы научимся сортировать многомерный массив, используя в качестве примера список самых высоких зданий в мире. Наш массив будет содержать информацию о здании: название, месторасположение (город, страна), количество этажей, общая высота в метрах, год постройки.
Если вы хотите отсортировать значения в многомерном массиве на основе определенного поля, вы можете просто использовать функцию . Приведенный ниже пример поможет вам лучше понять эту технику.
В приведенном выше примере информация о каждом здании хранится в своем собственном массиве внутри основного массива . Функция просто вычитает количество этажей во втором здании, начиная с первого, чтобы определить, какое по нашим критериям здание меньше. Не следует беспокоиться о возврате определенного отрицательного или положительного значения, потому что все отрицательные значения означают меньшее, а все положительные значения означают большее.
В конце мы просто перебираем основной массив и выводим информацию о каждом здании.
Сортировка сложных и многомерных массивов с 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 )
Сортировка ассоциативных массивов: 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 );