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


Практически перед каждым PHP-программистом становится задача отсортировать многомерный массив. К примеру вот такой вот:

По, допустим, ключу year, как же сделать это грамотно?

Как просили меня в комментах — забегу немного вперед. В PHP есть встроенная функция array_multisort — она позволяет сортировать многомерные массивы. Но если вам интересно давайте рассмотрим все возможные методы сортировки многомерных массивов и их плюсы и минусы в сравнении с array_multisort.

Классическое решение

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

Запускаем, и засекаем время выполнения… Итого: 13.15 сек. Долговато и не впечатляет.

Ищем пути решения проблемы, находим на php.net, другой вариант функции сравнения, который, как там написано, должен работать быстрее:

Итого: 23.11 сек. Хреновая оптимизация…


Ладно, хорошо, со временем выполнения мы определились. Давайте попробуем определится с «расширяемостью кода». Допустим нам поставили задачу отсортировать сначала по ключу year а затем по ключу author. Для этого нам приходится переписывать всю «дополнительную функцию», в итоге получаем что то похожее на это:

Громоздко. Сложно изменять. Вообщем отстой, на мой взгляд.

Итак, подведем итоги. Минусы:

  • Долго выполняется
  • Сложно расширять
  • Под каждую сортировку нужна своя, новая функция

Плюсы:

  • Единственный очевидный вариант (?)

Пробуем костыли

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

Засекаем. Получаем: 7.90 сек. Ну уже не плохо впринципе.

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

  • Невозможно расширять
  • Сортировка только по одному ключу

Плюсы

  • Приемлимая скорость выполнения
  • Одна функция для разных видов сортировки

Функция array_multisort

Оказывается разработчики PHP уже давным давно все придумали до нас. Оказывается есть функция array_multisort. Как работает эта функция:
array_multisort( array &$arr [, array &$arr [, array &$arr... ]] )



Грубо говоря каждый массив будет отсортирован в соответствии с предыдущим массивом. Вообщем пример:

Выведет:

А это как раз то что нам надо! Возвращаемся к тестам на скорость:

Засекаем. Получаем: 3.87 сек. Это рекорд!

Ну то что это самый быстрый вариант мы определили. Это хорошо. А как насчет расширяемости? Как к примеру заставить сортировать массив по двум ключам? Оказывается с этой функцией очень просто! Достаточно добавить еще один «определяющий массив», вот так:

На выходе получим вот такой массив:

Как видите функция справилась со своей задачей. Наш массив отсортирован сначала по year, затем по author. А с помощью различных флагов типа SORT_DESC, SORT_ASC и тд можно добится любой сортировки (про них подробнее смотрите в мане), так что это на мой взгляд самый лучший вариант для использования в своих скриптах.

Минусы

  • ??

Плюсы

  • Лучшая скорость
  • Расширяемость
  • Функциональность

Заключение

Вообщем используйте array_multisort для сортировки многомерных массивов. И будет вам счастье.

Спасибо за внимание =)

intsystem.org

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


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

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

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

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

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

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

 Array (  [0] => 1   [1] => 2   [2] => 3 ) 

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

  Array (  [1] => Array (  [id] => 1  )   [0] => Array (  [id] => 2  )   [2] => Array (  [id] => 3  ) ) 

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

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

http://cccp-blog.com/wp-includes/images/banners/templatemonster/banner_content.jpg


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

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

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

  Array (  [id_ученика] => 12   [фио] => Иванов Иван Иванович   [средний_балл] => 3 )  

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

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

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

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

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

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

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

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

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

  Array ( …  

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

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

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

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


Библиотека курсов

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

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

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

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

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

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

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

 Array (  [2] => 11   [0] => 18   [1] => 9 ) 

Итак, как же можно произвести сортировку массива в нужном порядке на 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 (  [0] => 9   [1] => 11   [2] => 18 )  

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

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

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

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


  Array (  [0] => 18   [1] => 11   [2] => 9 )  

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

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

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

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

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

  Array (  [1] => 9   [2] => 11   [0] => 18 )  

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

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

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

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

  Array (  [0] => 18   [2] => 11   [1] => 9 )  

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

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

Эта особенность делает их пригодными для решения различных нестандартных задач, порой весьма интересных ?

natsort($array); — данная функция вносит разнообразие в семейку sort-подобных решений, т.к. механизм её работы в корне отличается от них. У natsort есть всего один-единственный входной параметр – это сортируемый массив, значения которого будут расположены в порядке, привычном для человека. Такой алгоритм носит название «natural ordering», что по-русски означает «естественный порядок». Для того, чтобы был понятен смысл данного утверждения, мы в качестве примера возьмём другой массив:

  Array (  [0] => ученик5   [1] => ученик1   [2] => ученик10 )  

Кроме того, функция natsort сохраняет связь «ключ-значение». Поэтому её работу мы будет сравнивать с asort, которая максимально похожа на неё. После вызова последней наш массив примет следующий вид:

  Array (  [0] => ученик1   [1] => ученик10   [2] => ученик5 )  

Если же вызвать natsort, то итоговый массив будет таким:

  Array (  [1] => ученик1   [0] => ученик5   [2] => ученик10 )  

Думаю, разница вам теперь видна и принцип работы natsort для вас будет понятен:-)

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

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

При этом связь «ключ-значение» не сохраняется. То есть, массив, используемый нами в предыдущем примере, лично у меня принял вид:

  Array (  [0] => ученик10   [1] => ученик5   [2] => ученик1 )  

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

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

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

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

Одним из таких задач является сортировка многомерного массива php по нужному полю.

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

  Array (  [0] => Array (  [id] => 32  )   [1] => Array (  [id] => 11  )   [2] => Array (  [id] => 27  ) )  

Как вы видите, он многомерный, т.к. его элементами являются массивы, структура которых идентична: они все имеют поле с ключом «id». И теперь наша задача – рассортировать эти элементы по возрастанию, т.е. чтобы в главном массиве элементы были расположены в соответствии со значением полей в подмассивах.

Нужно сказать, довольно распространённая задача. Решить её нам помогут следующие функции:

usort($array, ‘function’); — функция php сортировки многомерного массива по нужному полю.

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

Сама функция описывается отдельно. Касательно нашего примера, для сортировки элементов многомерного массива php по полю [‘id’] в порядке возрастания пользовательская функция будет иметь следующий вид:

  function myCmp($a, $b) {  if ($a['id'] == $b['id']) return 0;  return $a['id'] > $b['id'] ? 1 : -1; }  

Всё, что нам теперь нужно, чтобы запустить сортировку, это сделать вызов функции usort($array, ‘myCmp’); в необходимом месте кода. В качестве первого параметра указывает имя переменной массива.

В итоге мы получим следующее:

  Array (  [0] => Array (  [id] => 11  )   [1] => Array (  [id] => 27  )   [2] => Array (  [id] => 32  ) )  

uasort($array, ‘function’); — ещё одна функция php сортировки многомерного массива по нужному полю.

Работает аналогично usort, но сохраняет связь «ключ-значение», что делает данную функцию пригодной для сортировки многомерных ассоциативных массивов.

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

  Array (  [1] => Array (  [id] => 11  )   [2] => Array (  [id] => 27  )   [0] => Array (  [id] => 32  ) )  

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

Например, если у вас в массивах, которые являются элементами исходного, будет содержаться поле [‘name’] со строковым значением, то пользовательская функция для сортировки многомерного массива php по этому полю в порядке возрастания будет выглядеть так:

 function myCmp($a, $b) {  if (strcasecmp($a['name'], $b['person']['name']) == 0) return 0;  return strcasecmp($a['name'], $b['name']) > 0 ? 1 : -1; } 

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

array_multisort($array1, $array2, $flag); — напоследок я приберёг самую страшную и малопонятную функцию php для сортировки массива. В качестве входных параметров она принимает два массива и те же флаги сортировки, которые можно указывать у sort-подобных функций. Работает array_multisort следующим образом: первый параметр – сортируемый массив, в качестве второго массива указывается порядок сортировки первого, после чего второй массив сортируется по аналогии с первым. Вместо массива, отражающего порядок сортировки, можно использовать константы SORT_DESC для сортировки массива по убыванию и SORT_ASC по возрастанию. Ко всей этой путанице ещё можно добавлять флаги сортировки, которые могут идти после всех массивов.

 $books = array(32, 11, 27); $sort_array = array(1, 2, 3); array_multisort($books, $sort_array); 

В данном примере я произвёл сортировку простого одномерного массива $books в соответствии с массивом $sort_array. В результате первый массив принял следующий вид:

 Array (  [0] => 11   [1] => 27   [2] => 32 )  

А второй стал таким:

  Array (  [0] => 2   [1] => 3   [2] => 1 )  

То есть, он отсортировался в соответствии с первым. Вот такая вот петрушка ?

Более детально об array_multisort рассказано на следующем видео. Также там вы найдёте дополнительные примеры её использования:

С помощью данной функции также можно производить сортировку многомерных массивов:

 $books = array(array(32), array(11), array(27)); $sort_array = array(1, 2, 3); array_multisort($books, $sort_array); 

Массив $books будет выглядеть так:

  Array (  [0] => Array (  [0] => 11  )   [1] => Array (  [0] => 27  )   [2] => Array (  [0] => 32  ) )  

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

Вот такой своеобразный «снежный ком» в php.

При сортировке массива php с помощью данной функции для ассоциативных массивов связь «ключ-значение» сохраняется, а для числовых – нет.

Программисты, которые производили тестирование работы различных функций, отмечают, что при сортировке многомерного массива php array_multisort показывает лучшие результаты, чем usort.

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

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

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

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

Функции php для сортировки массива по ключу

Перед тем, как мы перейдём к обзору функций данной группы я хотел бы сказать, что у всех них есть одна общая черта – все они сохраняют отношение «ключ-значение». А иначе, собственно говоря, и быть не могло, т.к. тогда от них не было бы смысла ?

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

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

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

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

  Array (  [2] => 11   [0] => 18   [1] => 9 )  

Если сделать его сортировку с помощью ksort, то в результате он примет следующий вид:

  Array (  [0] => 18   [1] => 9   [2] => 11 )  

Думаю, всё просто и понятно.

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

Единственное отличие заключается в том, что она производит сортировку массива php по убыванию. То есть, она является антагонистом ksort, как и rsort для sort.

У неё также два входных параметра: сортируемый массив и один из ключей. После её запуска наш пример примет вид:

  Array (  [2] => 11   [1] => 9   [0] => 18 )  

Думаю, комментарии излишни ?

ukrsort($array, ‘function’); — аналог упомянутой ранее функции php для сортировки массива по ключу — usort.

Работает по тому же принципу: сохраняет отношение «ключ-значение» и сортировка массива php производится в соответствии с пользовательской функцией, имя которой передаётся вторым параметром. Первый параметр неизменный – это сортируемый массив.

Отличие от usort заключается в том, что сортировка происходит по ключам элементов.

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

  Array (  [forty] => 40   [zero] => 0   [ten] => 10 )  

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

  function myCmp($a, $b) {  if ($a == $b) return 0;  return $a < $b ? 1 : -1; }  

В результате наш массив примет следующий вид:

  Array (  [zero] => 0   [ten] => 10   [forty] => 40 )  

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

Напоминаю, что использовать её нужно только в том случае, когда ключи элементов массива несут какую-то смысловую нагрузку. В противном же случае, лучше использовать usort или другие, более простые функции.

Вот наша статья и подошла к концу (лайк, если дочитал до этого места) ?

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

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

Надеюсь, информация была для вас полезна ?

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

Не будьте пассивными и вам обязательно воздастся ?

Всем удачи и до новых встреч!

cccp-blog.com

PHP 7 +

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

Вы можете сделать восходящую сортировку следующим образом:

usort($inventory, function ($item1, $item2) {  return $item1['price'] <=> $item2['price']; }); 

Или нисходящий вид вроде этого:

usort($inventory, function ($item1, $item2) {  return $item2['price'] <=> $item1['price']; }); 

Чтобы понять, как это работает, обратите внимание, что usort использует предоставленную пользователем функцию сравнения, которая должна вести себя следующим образом (из документов):

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

Отметим также, что <=>, оператор космического корабля

возвращает 0, если оба операнда равны, 1, если слева больше, а -1, если правое больше

что и требуется usort. Фактически, почти полное обоснование, данное для добавления <=> к языку в https://wiki.php.net/rfc/combined-comparison-operator, состоит в том, что он

позволяет записывать обратные вызовы для записи с usort() проще


PHP 5.3 +

PHP 5.3 представил анонимные функции, но еще не имеет оператора космического корабля. Мы все еще можем использовать usort для сортировки нашего массива, но это немного более подробный и трудный для понимания:

usort($inventory, function ($item1, $item2) {  if ($item1['price'] == $item2['price']) return 0;  return $item1['price'] < $item2['price'] ? -1 : 1; }); 

Обратите внимание, что, хотя для компараторов, имеющих дело с целыми значениями, достаточно просто вернуть разность значений, например $item2['price'] - $item1['price'], мы не можем смело сделать это в этом случае. Это связано с тем, что цены являются числами с плавающей запятой в примере вопросчика, но функция сравнения, которую мы передаем в usort, должна возвращать целые числа для usort для правильной работы:

Возвращение значений нецелых из функции сравнения, таких как float, приведет к внутреннему приведению к целому числу возвращаемого значения обратного вызова. Таким образом, значения, такие как 0.99 и 0.1, будут приведены к целочисленному значению 0, которое сравнивает такие значения как равные.

Это важная проблема, которую следует учитывать при использовании usort в PHP 5.x! Моя первоначальная версия этого ответа допустила эту ошибку, и все же я набрал десять надписей над тысячами просмотров, по-видимому, никто не заметил серьезной ошибки. Легкость, с которой такие недостатки, как я, может испортить функции компаратора, — это именно то, что более простой в использовании оператор космического корабля был добавлен к языку в PHP 7.

qaru.site

array_multisort() сортирует многомерные массивы по значению, также может отсортировать сразу несколько массивов.

$array = array(   array(20, 222, 2, 22),   array(10, 111, 1, 11),  );    array_multisort($array);  print_r($array);
Array  (   [0] => Array(   [0] => 10   [1] => 111   [2] => 1   [3] => 11   )   [1] => Array(   [0] => 20   [1] => 222   [2] => 2   [3] => 22   )  )

Чтобы изменить направление сортировки вторым аргументом функции указывается SORT_ASC или SORT_DESC.

array_multisort($array, SORT_DESC);  print_r($array);

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

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

В примере сортировка идет по ключу «count».

$array = array(   array(   'sku' => '645908-463',   'count' => '1'   ),   array(   'sku' => '64590644',   'count' => '20'   ),   array(   'sku' => '7543',   'count' => '2'   )  );    // По возрастанию:  function cmp_function($a, $b){   return ($a['count'] > $b['count']);  }    uasort($array, 'cmp_function');  print_r($array);    // По убыванию:  function cmp_function_desc($a, $b){   return ($a['count'] < $b['count']);  }    uasort($array, 'cmp_function_desc');  print_r($array);
Array  (   [0] => Array(   [sku] => 645908-463   [count] => 1   )   [2] => Array(   [sku] => 7543   [count] => 2   )   [1] => Array(   [sku] => 64590644   [count] => 20   )  )    Array  (   [1] => Array(   [sku] => 64590644   [count] => 20   )   [2] => Array(   [sku] => 7543   [count] => 2   )   [0] => Array(   [sku] => 645908-463   [count] => 1   )  )

Второй вариант на основе функции array_multisort():

function array_multisort_value()  {   $args = func_get_args();   $data = array_shift($args);   foreach ($args as $n => $field) {   if (is_string($field)) {   $tmp = array();   foreach ($data as $key => $row) {   $tmp[$key] = $row[$field];   }   $args[$n] = $tmp;   }   }   $args[] = &$data;   call_user_func_array('array_multisort', $args);   return array_pop($args);  }    $array = array(   array(   'sku' => '645908-463',   'count' => '1'   ),   array(   'sku' => '64590644',   'count' => '20'   ),   array(   'sku' => '7543',   'count' => '2'   )  );    $array = array_multisort_value($array, 'count', SORT_DESC);  print_r($array);

snipp.ru

Функция sort(); — Сортировка массива по возрастанию и по алфавиту

Структура:

sort( $Массив, $Флаг );

Функция сортирует заданный ей массив $Массив по возрастанию. Функция предназначена для работы со списками. Списки это обычные массивы, ключи которых начинаются с нуля. Функции можно задать необязательный аргумент $Флаг, который манипулирует тем как именно должно происходить сортировка. Рассмотрим описание аргумента $Флаг:

SORT_REGULAR – Сортировка по умолчанию работы функции

SORT_NUMERIC — Сортировка чисел, по возрастанию

SORT_STRING — Сортировка строк, по алфавиту

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

<?php $Leasons = array(83, 100, 72); sort($Leasons); foreach($Leasons as $num) { 	$palce++; 	echo "Курс: {$palce} - {$num} пар<br />"; } ?>

Результат работы скрипта:

Курс: 1 - 72 пар Курс: 2 - 83 пар Курс: 3 - 100 пар

Если бы мы не применили функцию sort(); результат работы был бы следующим:

Курс: 1 - 83 пар Курс: 2 - 100 пар Курс: 3 - 72 пар

Сортировка по алфавиту

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

<?php $Country = array("Россия", "Италия", "Япония", "Армения"); sort($Country); foreach($Country as $name) { 	echo "{$name}<br />"; } ?>

Результат работы:

Армения Италия Россия Япония

live-code.ru

A – Сортировка по оценке (параметр grade) (числовая сортировка)

Определим функцию для сортировки массива по оценке (параметр grade):

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

Пример:

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

Выводя на экран значения $x[‘оценка’] и $y [‘оценка’], можно увидеть, как вызывается функция сортировки, определенная пользователем.

Можно сократить функцию grade_sort следующим образом:

Результаты сортировки двумерного массива PHP по оценке отображены на картинке ниже:

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

B – Сортировка по имени (в алфавитном порядке)

Чтобы отсортировать массив $students по первому ключу, необходимо сравнить две строки. Поэтому в примере с сортировкой в алфавитном порядке воспользуемся функция strcasecmp() (не чувствительна к регистру) и strcmp() (чувствительна к регистру). Получившийся двумерный массив PHP будет иметь следующий вид:

Пример:

На скриншоте, приведенном ниже, показан результат сортировки по имени:

Перевод статьи «Sorting multi-dimensional array in PHP» был подготовлен дружной командой проекта Сайтостроение от А до Я.

www.internet-technologies.ru

array_reverse

Расстановка элементов массива в обратном порядке.
Синтаксис:

array array_reverse(array arr [, bool preserve_keys])

Функция array_reverse() возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями не теряются, если дополнительный параметр preserve_keys = TRUE.

Пример использования функции array_reverse():

<?php$input = array("php", 4.0, array("green", "red"));
$result = array_reverse($input);
$result_keyed = array_reverse($input, true);
?>

Этот пример сделает оба массива $result и $result_keyed с одинаковыми значениями, но различными ключами. Распечатка массивов $result и $result_keyed будет следующей:

Array(
[0] => Array
(
[0] => green
[1] => red
)

[1] => 4
[2] => php
)
Array(
[2] => Array
(
[0] => green
[1] => red
)

[1] => 4
[0] => php
)

Примечание: Второй параметр preserve_keys был добавлен в PHP 4.0.3.

Функция поддерживается PHP 4, PHP 5

natcasesort

Выполняет естественную сортировку массива без учета регистра символов.
Синтаксис:

void natcasesort(array arr)

Функция natcasesort() сортирует массив arr в естественном для человека порядке с сохранением индексных ассициаций.
Эта функция схожа с natsort(), только не учитывает регистр символов.
Пример использования функции natcasesort():

<?php$array1 = $array2 = array("IMG0.png", "img12.png", "img10.png",
"img2.png", "img1.png", "IMG3.png");

sort($array1);
echo "Стандартная сортировкаn";
print_r($array1);

natcasesort($array2);
echo "nЕстественная сортировка (без учета регистра)n";
print_r($array2);
?>

Приведенный пример выведет следующее:

Стандартная сортировкаArray(
[0] => IMG0.png
[1] => IMG3.png
[2] => img1.png
[3] => img10.png
[4] => img12.png
[5] => img2.png
)

Естественная сортировка (без учета регистра)
Array(
[0] => IMG0.png
[4] => img1.png
[3] => img2.png
[5] => IMG3.png
[2] => img10.png
[1] => img12.png
)

Функция поддерживается PHP 4, PHP 5

uasort

Пользовательская сортировка ассоциативного массива с сохранением индексных ассоциаций.
Синтаксис:

bool uasort(array arr, function cmp_function)

Функция uasort() сортирует массив arr с сохранением индексных ассоциаций, используя для сравнения индексов элементов пользовательскую функцию, указанную аргументом cmp_function.
Эта функция используется главным образом когда соответствие индексов и значений массива существенно.
Функция uasort() возвращает true в случае успешного завершения сортировки, и false в противном случае.
Замечание: Смотрите функции usort() и uksort() для написания пользовательской функции.
Функция поддерживается PHP 3 >=3.0.4, PHP 4, PHP 5

uksort

Пользовательская сортировка массива по ключам.
Синтаксис:

bool uksort(array arr, function cmp_function)

Функция uksort() сортирует массив arr по индексам с сохранением индексных ассоциаций, используя для сравнения индексов элементов пользовательскую функцию, указанную в аргументе cmp_function. В эту функцию передаются два сравниваемых индекса элементов, а она должна вернуть положительное или отрицательное число или 0.

Функция uksort() возвращает true в случае успешного завершения сортировки, и FALSE в противном случае.
Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files храниться список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексографическом порядке, но также чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().

1 пример использования функции uksort():

// Эта функция должна сравнивать значения $f1 и $f2 и возвращать:
// -1, если $f1<$f2,
// 0, если $f1==$f2
// 1, если $f1>$f2
// Под < и > понимаем следование этих имен в выводимом спискеfunction FCmp($f1,$f2)
{ // Каталог всегда предшествует файлу
if(is_dir($f1) && !is_dir($f2)) return -1;
// Файл всегда идет после каталога
if(!is_dir($f1) && is_dir($f2)) return 1;
// Иначе сравниваем лексиграфически
if($f1<$f2) return -1; elseif($f1>$f2) return 1; else return 0;
}
// Пусть $Files содержит массив с ключами - именами файлов
// в текущем каталоге. Отсортируем его.uksort($Files,"FCmp"); //передаем функцию сортировки "

array_multisort()

Сортировать несколько массивов или многомерные массивы (PHP 4, PHP 5)

Описание:

bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )

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

Входные массивы рассматриваются как столбцы таблицы, которую нужно отсортировать по строкам — такой подход напоминает поведение выражения SQL ORDER BY. Первый массив имеет проиоритет в процессе сортировки.

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

Значения, определяющие порядок сортировки:

SORT_ASC — сортировать в возрастающем порядке
SORT_DESC — сортировать в убывающем порядке

Флаги типа сортировки:

SORT_REGULAR — сравнивать элементы обычным образом
SORT_NUMERIC — сравнивать элементы, как если бы они были числами
SORT_STRING — сравнивать элементы, как если бы они были строками

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

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Сортировка нескольких массивов

$ar1 = array ("10", 100, 100, "a");
$ar2 = array (1, 3, "2", 1);
array_multisort ($ar1, $ar2);

В вышеприведенном примере, после того, как будет осуществлена сортировка, первый массив будет содержать 10, «a», 100, 100. Второй — 1, 1, «2», 3. Элементы второго массива, соответствующие идентичным элементам первого (100 и 100), также будут отсортированы.

Сортировка многомерного массива

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);

В вышеприведенном примере, после сортировки, первый массив будет содержать 10, 100, 100, «a» (его элементы были отсортированы в возрастающем порядке так, как если бы они были строками), а второй массив будет содержать 1, 3, «2», 1 (элементы отсортированы как числа, в порядке убывания).

usort()

Отсортировать массив по значениям используя пользовательскую функцию для сравнения элементов (PHP 3 >= 3.0.3, PHP 4, PHP 5)

Описание:

bool usort ( array &array, callback cmp_function )

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

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

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

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

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

<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

while (list($key, $value) = each($a)) {
echo "$key: $value
";
}
?>

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

0: 1
1: 2
2: 3
3: 5
4: 6

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

Пример использования функцией usort() многомерных массивов

<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

while (list($key, $value) = each($fruits)) {
echo "$fruits[$key]: " . $value["fruit"] . "
";
}
?>

При сортировке многомерного массива переменные $a и $b содержат ссылки на первые два индекса массива.

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

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons

Пример использования usort() с методом класса

<?php
class TestObj {
var $name;

function TestObj($name)
{
$this->name = $name;
}

/* This is the static comparing function: */
function cmp_obj($a, $b)
{
$al = strtolower($a->name);
$bl = strtolower($b->name);
if ($al == $bl) {
return 0;
}
return ($al > $bl) ? +1 : -1;
}
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

usort($a, array("TestObj", "cmp_obj"));

foreach ($a as $item) {
echo $item->name . "
";
}
?>

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

b
c
d

shuffle

Перемешивание элементов массива.
Синтаксис:

void shuffle(array arr)

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

<?php
$numbers = range(1, 20);
srand((float)microtime() * 1000000);
shuffle($numbers);
while (list(, $number) = each($numbers)) {
echo "$number ";
}

?>

Замечание: Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand()
или mt_srand(), поскольку теперь это происходит автоматически.
Функция поддерживается PHP 3 >= 3.0.8, PHP 4, PHP 5

sort

Сортировка массива по возрастанию.
Синтаксис:

bool sort(array arr [, int sort_flags])

Функция sort() предназначена для сортировки массивов в порядке возрастания.
Замечание: Эта функция изменяет ключи у отсортированных значений. Т.е. любой ассоциативный массив воспринимается этой функцией как список. После упорядочивания последовательность ключей превращается в 0,1,2,…, а значения нужным образом перераспределяются. Как видим, связи между параметрами ключ=>значение не сохраняются, более того — ключи просто пропадают, поэтому сортировать что-либо, отличное от списка, вряд ли целесообразно.
Пример использования функции sort():

<?php$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "fruits[" . $key . "] = " . $val . "n";
}
?>

Этот пример выведет:

fruits[0] = applefruits[1] = bananafruits[2] = lemonfruits[3] = orange

Аргумент sort_flags задает следующие флаги сортировки:
SORT_REGULAR — сравнивает элементы «как есть»;
SORT_NUMERIC — сравнивает элементы как числа;
SORT_STRING — сравнивает элементы как строки.
Функция поддерживается PHP 3, PHP 4, PHP 5

rsort

Сортировка массива по убыванию.
Синтаксис:

bool rsort ( array array [, int sort_flags])

Функция rsort() сортирует массив array в порядке убывания (от высших значений к низшим).

Функция возвращает TRUE в случае успешного завершения, и FALSE в противном случае.
Пример использования функции rsort():

<?php$fruits = array("lemon", "orange", "banana", "apple");
rsort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>

Этот пример выведет:

0 = orange
1 = lemon
2 = banana
3 = apple

Аргумент sort_flags задает следующие флаги сортировки:
SORT_REGULAR — сравнивает элементы «как есть»
SORT_NUMERIC — сравнивает элементы как числа SORT_STRING — сравнивает элементы как строки
Функция поддерживается PHP 3, PHP 4, PHP 5

asort

Сортировка ассоциативного массива по возрастанию.
Синтаксис:

bool asort(array arr [, int sort_flags])

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

Функция возвращает true в случае успешного завершения, и false в случае возникновения ошибки.
Пример использования функции asort():

<?php$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>

Пример выведет следующее:

c = appleb = bananad = lemona = orange

Массив $fruits был отсортирован в возрастающем символьном порядке, при этом индексы массива были сохранены.
Метод сортировки может быть изменен при помощи необязательного параметра sort_flags.
Этот параметр может указать, как сравнивать значения (как строки или как числа). Он может принимать следующие предопределенные значения:
SORT_REGULAR — нормальное сравение значений;
SORT_NUMERIC — сравнивать как числа;
SORT_STRING — сравнивать как строки.
Этот параметр был введен в PHP начиная с 4 версии.
Функция поддерживается PHP 3, PHP 4, PHP 5

arsort

Сортировка ассоциативного массива по убыванию.
Синтаксис:

bool arsort(array arr [, int sort_flags])

Функция arsort() сортирует массив arr по убыванию с сохранением индексных ассоциаций.
Эта функция используется главным образом там, где существенен порядок элемента в массиве.
Функция возвращает true в случае успешной сортировки, и false в случае возникновения ошибки.
Пример использования функции arsort():

<?php$arr=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort($arr);
reset($arr);
while(list ($key, $val) = each ($arr)) {
echo "$key = $vall";
}

Пример выведет:

a = oranged = lemonb = bananac = apple

Массив $arr был отсортирован в убывающем символьном порядке, при этом индексы массива были сохранены.
Метод сортировки может быть изменен при помощи необязательного параметра sort_flags.
Этот параметр может указать, как сравнивать значения (как строки или как числа). Он может принимать следующие предопределенные значения:
SORT_REGULAR — нормальное сравение значений;
SORT_NUMERIC — сравнивать как числа;
SORT_STRING — сравнивать как строки.
Этот параметр был введен в PHP начиная с 4 версии.
Функция поддерживается PHP 3, PHP 4, PHP 5

ksort

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

bool ksort(array arr [, int sort_flags])

Функция ksort() сортирует массив в порядке возрастания ключей с сохранением взаимосвязей ключей и значений. Эта функция особенно полезна при сортировке ассоциативных массивов.
Функция возвратит true, если все прошло успешно, и false в противном случае.
Пример использования функции ksort():

<?php$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>

Данный пример выведет:

a = orangeb = bananac = appled = lemon

Аргумент sort_flags задает следующие флаги сортировки:
SORT_REGULAR — сравнивает элементы «как есть»
SORT_NUMERIC — сравнивает элементы как числа SORT_STRING — сравнивает элементы как строки
Функция поддерживается PHP 3, PHP 4, PHP 5

krsort

Сортировка массива по убыванию индексов.
Синтаксис:

bool krsort(array arr [, int sort_flags])

Функция krsort() сортирует ключи в массиве arr в обратном порядке. При этом связка ключей и значений сохраняется. Эта функци полезна при сортировке ассоциативных массивов.
Функция возвращает true в случае успешного завершения, и false в противном случае.
Пример использования функции krsort():

<?php$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort($fruits);
reset($fruits);
while (list($key, $val) = each($fruits)) {
echo "$key = $valn";
}
?>

Данный пример выведет:

d = lemonc = appleb = bananaa = orange

Аргумент sort_flags задает следующие флаги сортировки:
SORT_REGULAR — сравнивает элементы «как есть»
SORT_NUMERIC — сравнивает элементы как числа SORT_STRING — сравнивает элементы как строки
Функция поддерживается PHP 3 >= 3.0.13, PHP 4, PHP 5

natsort

Выполняет «естественную» сортировку массива.
Синтаксис:

void natsort(array arr)

Функция natsort() сортирует массив arr в естественном для человека порядке с сохранением индексных ассициаций.
Пример использования функции natsort():

<?php$array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");

sort($array1);
echo "Стандартная сортировкаn";
print_r($array1);

natsort($array2);
echo "nЕстественная сортировкаn";
print_r($array2);
?>

Этот пример выведет следующее:

Стандартная сортировкаArray(
[0] => img1.png
[1] => img10.png
[2] => img12.png
[3] => img2.png
)

Естественная сортировкаArray(
[3] => img1.png
[2] => img2.png
[1] => img10.png
[0] => img12.png
)

Функция поддерживается PHP 4, PHP 5

php.info-kna.ru

PHP: сортировка внешнего массива по ключам, а вложенных — по значениям

Понадобилось в задаче. В PHP много красивых функций сортировки, но готового примера не нашёл. Массив, в принципе, может быть и многоуровневым, раз функция сортировки рекурсивная, но мне больше 2 уровней не нужно, данные примерно вот такого плана:

$array = array (   'pages' => array ('Russian','English US','Greek'),   'os' => array ('Windows','Linux','Android'),   'countries' => array ('USA','Russia','Usraina')   );

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

Вот листинг примера и его вывод.

<?php   function sortArray (&$a,$nested=false) { //рекурсивная сортировка ассоциативного массива   $nested ? asort ($a,SORT_NATURAL|SORT_FLAG_CASE) : ksort($a,SORT_NATURAL|SORT_FLAG_CASE);   foreach ($a as $key=>$value) if (is_array($value)) {   $a[$key] = sortArray($value,true);   }   return $a;   }     function printArray (&$a) { //рекурсивная печать ассоциативного массива   echo '<blockquote>'."n";   foreach ($a as $key=>$value) {   echo $key.': '."n";   if (is_array($value)) printArray ($value);    else echo htmlspecialchars($value).'<br>'."n";   }   echo '</blockquote>'."n";   }     header('Content-Type: text/html; charset=utf-8');   $array = array (   'pages' => array ('Russian','English US','Greek'),   'os' => array ('Windows','Linux','Android'),   'countries' => array ('USA','Russia','Usraina')   );   sortArray ($array);   printArray ($array);  ?>
countries:     1: Russia   0: USA   2: Usraina    os:     2: Android   1: Linux   0: Windows    pages:     1: English US   2: Greek   0: Russian

Массив функцией sortArray получен по ссылке, но оператор return $a; в функции нужен, так как сортируются и помещаются «на место» вложенные элементы-массивы. Поэтому для большого объёма данных подход нежелателен.

Если надо «перебить», а не сохранить ключи во вложенных массивах, замените в sortArray вызов asort на sort.

Данные не обязательно закодированы в Юникоде, но если оставить директиву header, то на ряде локальных серверов, таких как Denwer, в папке скрипта нужен и файл .htaccess с указанием

AddDefaultCharset utf-8

Можно было бы всё делать через лучшую функцию сортировки uasort, применив пользовательскую функцию сравнения 2 элементов как здесь:

<?php   function trimall ($string) { //убрать лишние разделители   return preg_replace("/(^s*)|(s*$)/","",preg_replace("/s+/"," ",trim($string)));   }     function cmp ($a0,$b0) { //сравнение 2 элементов как строк Юникода, с игнорированием регистра   $a = mb_strtolower(trimall(''.$a0),'UTF-8');   $b = mb_strtolower(trimall(''.$b0),'UTF-8');   $alen = mb_strlen ($a,'UTF-8');   $blen = mb_strlen ($b,'UTF-8');   for ($i=0; $i<min($alen,$blen); $i++) {   $ca = mb_substr ($a, $i, 1, 'UTF-8');   $cb = mb_substr ($b, $i, 1, 'UTF-8');   if ($ca<$cb) return -1;   else if ($ca>$cb) return 1;   }   if ($alen<$blen) return -1;   else if ($alen>$blen) return 1;   else return 0;   }     function sortArray (&$a) { //рекурсивная сортировка ассоциативного массива   uasort ($a,'cmp');   foreach ($a as $key=>$value) if (is_array($value)) {   $a[$key] = sortArray($value);   }   return $a;   }     header('Content-Type: text/html; charset=utf-8');   $array = array (   'pages' => array ('Russian','English US','Greek'),   'os' => array ('Windows','Linux','Android'),   'countries' => array ('USA','Russia','Usraina')   );   sortArray ($array);   echo '<pre>';   print_r ($array);   echo '</pre>';  ?>

Рекурсивная сортировка в sortArray стала выглядеть наглядней, не так ли? Зато посимвольный разбор строк Юникода будет явно медленней стандартного.

Вот что вышло (последний листинг печатает массив стандартной функцией print_r):

Array  (   [countries] => Array   (   [1] => Russia   [0] => USA   [2] => Usraina   )     [os] => Array   (   [2] => Android   [1] => Linux   [0] => Windows   )     [pages] => Array   (   [1] => English US   [2] => Greek   [0] => Russian   )    )

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

blog.kislenko.net


You May Also Like

About the Author: admind

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.