Php5 сортировка массивов
Содержание:
Sorting based on a list of values
There are situations where it’s not possible to use a numeric or
alphabet-based sort routine. Suppose that you have the following
data to present on a website:
| index | name | position |
|---|---|---|
| Mary Johnson | Secretary | |
| Amanda Miller | Member | |
| James Brown | Member | |
| Patricia Williams | Member | |
| Michael Davis | President | |
| Sarah Miller | Vice-President | |
| Patrick Miller | Member |
And that you want to sort these names by their position, based on the
following list:
Again, it’s not as difficult as you might think. All we need is the
following custom function:
If you don’t have a second field that you want to sort by, just
replace the highlighted line with return 0;
All we’re doing here is looking at the values in the
position field. If they’re identical then we sort by the
name field instead. Otherwise we do a comparison of where in
the sortorder list the relevant values appear and sort based on
that. The output is as follows:
| index | name | position |
|---|---|---|
| Michael Davis | President | |
| Sarah Miller | Vice-President | |
| Mary Johnson | Secretary | |
| Amanda Miller | Member | |
| James Brown | Member | |
| Patricia Williams | Member | |
| Patrick Miller | Member |
As detailed above for simpler cases we can now enhance this function
to make it more generic and re-usable, but I’ll leave that as an
exercise for you. You would need pass the sortorder array to
the function along with details of which fields to sort by.
If you’re working on the web with this type of data, you might also
want to read the article Formatting Data as
HTML which presents instructions for converting PHP data to HTML
tables, lists and forms.
Основные функции сортировки массива в PHP
Для сортировки массива в PHP вы можете использовать встроенные функции и . Разница между ними заключается в том, что сортирует массив в обратном порядке (по убыванию), а – в обычном порядке (по возрастанию).
Давайте посмотрим, как это работает. Отсортируем массив с помощью функции , прежде чем отобразить его содержимое. Код выглядит так:
<?php
sort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>
Результат будет следующим:
0 - black 1 - blue 2 - green 3 - red 4 - white
Как вы могли заметить, эта функция назначает новые ключи для элементов в массиве. Функция сортировки удаляет все существующие ключи, которые вы могли назначить, вместо того, чтобы просто переупорядочивать ключи. Решение этой проблемы рассмотрим позже.
Если вам нужен обратный порядок, единственное, что вам нужно сделать, это использовать вместо этого функцию , например, так:
<?php
rsort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>
И результат будет следующий:
0 - white 1 - red 2 - green 3 - blue 4 - black
Теперь давайте узнаем, как решить проблему с потерей ключей, что важно, если вы используете ассоциативные массивы
Сортировка ассоциативных массивов в PHP
Как мы видели ранее, функции и не подойдут, если нам нужно сохранить ключи нашего массива. К счастью, в PHP есть встроенные функции и для этой проблемы. Функции называются и . По примеру вышерассмотренных функций, сортирует по возрастанию, а – по убыванию. Кроме этого, данные функции поддерживают сохранение ключей массива. Итак, давайте посмотрим, как эти функции справляются с сортировкой данных в массиве. Повторим наш тест с использованием новых функций:
<?php
asort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>
Результат будет следующим:
night - black sky - blue grass - green apple - red wall - white
Теперь результат выглядит намного лучше. Чтобы получить сортировку в обратном порядке, просто используйте функцию вместо .
Но что делать, если вы хотите отсортировать ассоциированные массивы на основе ключей? Нет проблем, давайте посмотрим как это сделать.
Как сортировать массив по ключу в PHP
Вы уже вероятно догадались, что в PHP есть функция сортировки ассоциативного массива по ключам. Этими функциями являются и . Как и прежде, сортирует массив в обратном порядке. Использование такое же, как и раньше, поэтому код будет следующим:
<?php
ksort($spisokTsvetov);
foreach ($spisokTsvetov as $key => $value) {
echo '<p>' . $key . ' - ' . $value . '</p>';
}
?>
Результат будет следующим:
apple - red grass - green night - black sky - blue wall - white
Использовать функцию довольно просто.
Помимо рассмотренных функций в PHP есть и другие, более сложные функции сортировки:
- – сортировка нескольких или многомерных массивов.
- – сортировка массива с использованием нечувствительного к регистру алгоритма «естественного порядка»
- – сортировка массива с использованием алгоритма «естественного порядка».
- – сортирует массив с помощью пользовательской функции сравнения и поддерживает связь с индексами.
- – сортирует массив по ключам, используя пользовательскую функцию сравнения
- – сортирует массив по значениям, используя пользовательскую функцию сравнения
Бонусный навык: поиск в массиве с помощью PHP
Представьте себе, что у вас есть большой массив, который заполняется из файла или кода. И вы не знаете, существует ли данное значение в массиве или нет. И если оно существует, то было бы хорошо получить ключ этого элемента.
Массив рассмотрим тот же (что в самом начале статьи).
Теперь, если вы хотите узнать, существует ли значение , вы можете использовать встроенную в PHP функцию . Ниже пример ее использования:
<?php
echo 'Blue is ' . array_search("blue", $spisokTsvetov);
?>
В результате вы получите следующее значение:
Blue is sky
На сегодня все, спасибо, что читаете нас!
-
1144
-
68
-
Опубликовано 09/12/2019
-
PHP, Уроки программирования
Sorting on multiple fields
If you want to sort by lastname AND firstname, then you might think
that just applying two sorts in sequence would give you the desired
result:
Note that here we’ve specifed the current namespace
__NAMESPACE__ to make the code compatible with PHP namespaces. Otherwise any
function you pass has to exist in the global namespace.
You might think so, but since PHP version 4.1 the usort and
related functions will essentially shuffle the array before sorting (the
algorithm is ‘no longer stable’):
See our Quick Sort Algorithm
article for more detail.
This means that, after ordering by first name, the result of then
sorting by last name will not necessarily retain the correct
order of first names.
So what’s the solution? We need a new function that can compare both
fields at the same time and then apply the sort:
Finally, the result we wanted:
| index | firstname | lastname | age |
|---|---|---|---|
| James | Brown | 31 | |
| Michael | Davis | 43 | |
| Mary | Johnson | 25 | |
| Amanda | Miller | 18 | |
| Patrick | Miller | 27 | |
| Sarah | Miller | 24 | |
| Patricia | Williams | 7 |
This function works because it first compares the last names, and
only if they are identical will it compare the first names to work out
the correct order.
You can extend this function to use more variables by inserting more
conditions every time $retval has a zero value.
Сортировка ассоциативных массивов: 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 );
Классическое решение
Естественно первое про что вы подумали, это сортировка многомерного массива с помощью uasort, да? Набросаем вот такой вот код:
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
for($i=0; $i<100000; $i++){
$data_tmp=$data;
uasort($data_tmp, ‘cmp’);
}
|
1 |
functioncmp($a,$b){ if($a’year’==$b’year’){ return; } return($a’year'<$b’year’)?-11; } for($i=;$i<100000;$i++){ $data_tmp=$data; uasort($data_tmp,’cmp’); } |
Запускаем, и засекаем время выполнения… Итого: 13.15 сек. Долговато и не впечатляет.
Ищем пути решения проблемы, находим на php.net, другой вариант функции сравнения, который, как там написано, должен работать быстрее:
function cmp($a, $b) {
return strcmp($a, $b);
}
for($i=0; $i<100000; $i++){
$data_tmp=$data;
uasort($data_tmp, ‘cmp’);
}
|
1 |
functioncmp($a,$b){ returnstrcmp($a’year’,$b’year’); } for($i=;$i<100000;$i++){ $data_tmp=$data; uasort($data_tmp,’cmp’); } |
Итого: 23.11 сек. Хреновая оптимизация…
Ладно, хорошо, со временем выполнения мы определились. Давайте попробуем определится с «расширяемостью кода». Допустим нам поставили задачу отсортировать сначала по ключу year а затем по ключу author. Для этого нам приходится переписывать всю «дополнительную функцию», в итоге получаем что то похожее на это:
function cmp($a, $b) {
if ($a == $b) {
if ($a == $b){
return 0;
}else{
return ($a < $b) ? -1 : 1;
}
}else{
return ($a < $b) ? -1 : 1;
}
}
|
1 |
functioncmp($a,$b){ if($a’year’==$b’year’){ if($a’author’==$b’author’){ return; }else{ return($a’author'<$b’author’)?-11; } }else{ return($a’year'<$b’year’)?-11; } } |
Громоздко. Сложно изменять. Вообщем отстой, на мой взгляд.
Итак, подведем итоги. Минусы:
- Долго выполняется
- Сложно расширять
- Под каждую сортировку нужна своя, новая функция
Плюсы:
Единственный очевидный вариант (?)
Using an ‘anonymous’ function
This is where it starts to get interesting. You can create an
anonymous function based on information gathered at run time.
This allows for greater flexibility, without too much extra coding.
The call can then be shortened to:
Finally, you can wrap it all into a single function as shown below.
Now the code’s starting to look more ‘readable’ which is a good
sign:
| index | firstname | lastname | age |
|---|---|---|---|
| Patricia | Williams | 7 | |
| Amanda | Miller | 18 | |
| Sarah | Miller | 24 | |
| Mary | Johnson | 25 | |
| Patrick | Miller | 27 | |
| James | Brown | 31 | |
| Michael | Davis | 43 |
We now have a simple generic function that can be used to sort any
associative array on a single scalar attribute.
Многомерные массивы
Как вы уже знаете, элементы массива могут содержать в качестве значения данные любого типа, строки, числа, логические, в том числе и другие массивы. Массив состоящий из других массивов называется многомерным или вложенным массивом. На практике используется 2-3 уровня вложенности для хранения каких-либо связанных структурных данных (например данных о покупателях магазина или каталоге товаров), обработка массивов большей вложенности усложняется и используется не часто.
Давайте разберёмся как создавать и взаимодействовать с многомерными массивами.
Создание многомерных массивов
В первую очередь создадим простой двумерный массив сотрудников организации:
Как видите используя многомерные массивы можно строить довольно сложные структуры данных с которыми в последствии предстоит работать нашему веб-приложению.
Доступ к элементам многомерного массива
Рассмотрим как получить доступ к элементам многомерного массива. В качестве примера возьмём выше описанные массивы сотрудников компании. Но перед этим предлагаю набросать небольшую функцию, которая позволит удобно просматривать содержимое переменных в вашем коде. Я часто использую её в работе:
Эта функция простая обёртка для просмотра содержимого переменной при помощи или тегов . Берите на вооружение.
И так, давайте узнаем имена и возраст всех сотрудников из первого двумерного массива:



Обработка многомерного массива
Один из примеров обработки массива был представлен выше, когда мы просто вывели на экран содержимое многомерного массива в удобном для пользователя виде. Однако это далеко не всё что можно делать с массивами. Например мы можешь осуществить некий поиск по элементам узнать сколько сотрудников старше 30 лет работает в нашей компании:
Здесь мы применили функцию array_walk_recursive() которая обходит каждый элемент массива вне зависимости от его вложенности и применяет к элементу пользовательскую функцию. В данном случае лямбда функция проверяет что текущий элемент это возраст и что его значение больше 30 и наращивает определённый во вне счётчик. Чтобы получить доступ в область видимости где применён счётчик используется конструкция и ссылка на переменную . В результате вы увидите сообщение: Количество сотрудников старше 30 лет: 3.
Существует множество примеров обработки массивов в PHP, но они выходят за рамки данной статьи.
Операции с массивами
Один из случаев ключевой операции с массивами, а именно его создание мы рассмотрели выше. А как ещё можно создать массив? Самый простой случай, это создание пустого массива:
Создание и модификация массива
Пустой массив может служить заготовкой под определённую коллекцию данных. Конечно его можно не определять заранее и создать прямо в цикле где он должен заполняться, но тогда это будет менее понятный код.
Вы так же можете заполнить массив на лету, например данными из базы данных:
Перебор массивов
С другой стороны готовый массив можно перебрать и например вывести его элементы на экран:
Вообще в php существует больше 70 функций для работы с массивами, однако в большинстве случаев вы будет использовать не больше двадцати. Приведу некоторые из них:
- in_array — проверяет присутствие элемента в массиве
- key_exists — проверяет присутствует ли в массиве указанный ключ или индекс
- array_search — осуществляет поиск заданного значения в массиве и возвращает ключ первого найденного значения
- array_merge — объединяет 2 и более массивов в один
- array_chunk — разбивает массив на части
Сортировка массива
Отдельным блоком может идти операции связанные с сортировкой массив. В PHP существует несколько встроенных функций для быстрой сортировки массивов, например по возрастанию/убыванию значения или в алфавитном порядке. Причём сортировка может идти как по ключам массива так и по значениям. Одной из интересных возможностей предоставляет функция , при помощи которой вы можете отсортировать элементы массива используя собственный алгоритм сравнения. Рассмотрим пример:
Как вы понимаете данный пример максимально упрощён. Но внутри вашей функции можно реализовать любой алгоритм сравнения элементов. Главное правильно возвращать значение, ноль — если элементы не отличаются и их не надо менять местами и 1 или -1 если нужно изменить порядок элементов.
Вы так же можете пробросить в тело функции внешнюю переменную используя анонимную функцию и ключевое слово :
Грубо говоря сортировка по возрастанию шла пока значение попадало в диапазон от 0 до 3-х.
Глобальные массивы
В PHP начиная с версии 4 ввели такой сущность как «суперглобальные массивы». Это особые переменные доступные в любой части приложения и содержат информацию, например о состоянии сервера (массив $_SERVER) сессии, куках или переданных от пользователя запросах, одним словом о состоянии среды выполнения приложения. На данный момент в PHP доступно девять суперглобальных массивов:
| Наименование | Описание массива |
| $GLOBALS | Этот массив содержим все переменные объявленные в скрипте, при этом имена переменных являются ключами этого массива. |
| $_SERVER | Данный массив содержит всю информацию о сервере, а так же настройки среды в которой выполняется скрипт |
| $_GET | Массив переменных переданных PHP скрипту по средствам GET запроса (через адресную строку браузера или другими методами, например curl()) |
| $_POST | Так же как и GET содержит переданные скрипту переменные, только уже методом POST |
| $_COOKIE | Содержим coockies-ы пользователя |
| $_REQUEST | Объединяет в себе массивы $GET, $POST и $COOKIE. Не рекомендуется использовать, не безопасно, хотя и удобно. |
| $_FILES | Содержим список файлов загружаемых на сервер через веб-формы (имя, временный путь, размеры и т.д.) |
| $_ENV | Содержит переменные окружения в котором запущен PHP скрипт |
| $_SESSION | В данном массиве содержаться все переменные сессии текущего пользователя |
Чаще всего, вы будете сталкиваться с массивами $_GET и $_POST т.к. с их помощью в скрипты на сервере передаются данные от клиентской части (через веб-формы).
asort()- Sort Array in Ascending Order, According to Value
There is the following function sorts an associative array in ascending order, as per according to the value.
we will use simple examples where the values refer to girls’ age. therefore, here the values are numerical, then the PHP sort array will be sorted in that order.
<?php
$age = array(«Giselle»=>»25», «Amara»=>»15», «Josephine»=>»28», «Penelope»=>»18» );
asort($age);
foreach($age as $x => $x_value) {
print_r («Key=» . $x . «, Value=» . $x_value);
print_r («<br>»);
}
?>
|
1 |
<?php $age=array(«Giselle»=>»25″,»Amara»=>»15″,»Josephine»=>»28″,»Penelope»=>»18»); asort($age); foreach($ageas$x=>$x_value){ print_r(«Key=».$x.», Value=».$x_value); print_r(«<br>»); } ?> |
Output:
Key=Amara, Value=15
Key=Penelope, Value=18
Key=Giselle, Value=25
Key=Josephine, Value=28
|
1 |
Key=Amara,Value=15 Key=Penelope,Value=18 Key=Giselle,Value=25 Key=Josephine,Value=28 |
Функция array_multisort
Оказывается разработчики PHP уже давным давно все придумали до нас. Оказывается есть функция array_multisort. Как работает эта функция:
Грубо говоря каждый массив будет отсортирован в соответствии с предыдущим массивом. Вообщем пример:
//Сортируемый масив
$array_main=array(
‘foo’,
‘bar’,
‘foobar’,
);
//Определяющий массив
$array_id=array(
3,
1,
2,
);
array_multisort($array_id, $array_main);
var_dump($array_main);
|
1 |
//Сортируемый масив $array_main=array( ‘foo’, ‘bar’, ‘foobar’, ); $array_id=array( 3, 1, 2, ); array_multisort($array_id,$array_main); var_dump($array_main); |
Выведет:
array(4) {
=> string(3) «bar»
=> string(3) «foobar»
=> string(3) «foo»
}
|
1 |
array(4){ =>string(3)»bar» 1=>string(3)»foobar» 2=>string(3)»foo» } |
А это как раз то что нам надо! Возвращаемся к тестам на скорость:
$data_year=array();
//Генерируем «определяющий» массив
foreach($data as $key=>$arr){
$data_year=$arr;
}
for($i=0; $i<100000; $i++){
$data_tmp=$data;
array_multisort($data_year, SORT_NUMERIC, $data_tmp);
}
|
1 |
$data_year=array(); //Генерируем «определяющий» массив foreach($data as$key=>$arr){ $data_year$key=$arr’year’; } for($i=;$i<100000;$i++){ $data_tmp=$data; array_multisort($data_year,SORT_NUMERIC,$data_tmp); } |
Засекаем. Получаем: 3.87 сек. Это рекорд!
Ну то что это самый быстрый вариант мы определили. Это хорошо. А как насчет расширяемости? Как к примеру заставить сортировать массив по двум ключам? Оказывается с этой функцией очень просто! Достаточно добавить еще один «определяющий массив», вот так:
$data_author=array();
foreach($data as $key=>$arr){
$data_author=$arr;
}
$data_year=array();
foreach($data as $key=>$arr){
$data_year=$arr;
}
array_multisort($data_year, SORT_NUMERIC, $data_author, $data);
var_export($data);
|
1 |
$data_author=array(); foreach($data as$key=>$arr){ $data_author$key=$arr’author’; } $data_year=array(); foreach($data as$key=>$arr){ $data_year$key=$arr’year’; } array_multisort($data_year,SORT_NUMERIC,$data_author,$data); var_export($data); |
На выходе получим вот такой массив:
array(
0 => array(‘text’ => ‘str3’, ‘year’ => ‘2009’, ‘author’ => 20, ),
1 => array(‘text’ => ‘str8’, ‘year’ => ‘2009’, ‘author’ => 20, ),
2 => array(‘text’ => ‘str1’, ‘year’ => ‘2010’, ‘author’ => 10, ),
3 => array(‘text’ => ‘str5’, ‘year’ => ‘2010’, ‘author’ => 20, ),
4 => array(‘text’ => ‘str4’, ‘year’ => ‘2010’, ‘author’ => 30, ),
5 => array(‘text’ => ‘str2’, ‘year’ => ‘2011’, ‘author’ => 10, ),
6 => array(‘text’ => ‘str6’, ‘year’ => ‘2011’, ‘author’ => 10, ),
7 => array(‘text’ => ‘str7’, ‘year’ => ‘2011’, ‘author’ => 20, ),
);
|
1 |
array( =>array(‘text’=>’str3′,’year’=>’2009’,’author’=>20,), 1=>array(‘text’=>’str8′,’year’=>’2009’,’author’=>20,), 2=>array(‘text’=>’str1′,’year’=>’2010’,’author’=>10,), 3=>array(‘text’=>’str5′,’year’=>’2010’,’author’=>20,), 4=>array(‘text’=>’str4′,’year’=>’2010’,’author’=>30,), 5=>array(‘text’=>’str2′,’year’=>’2011’,’author’=>10,), 6=>array(‘text’=>’str6′,’year’=>’2011’,’author’=>10,), 7=>array(‘text’=>’str7′,’year’=>’2011’,’author’=>20,), ); |
Как видите функция справилась со своей задачей. Наш массив отсортирован сначала по year, затем по author. А с помощью различных флагов типа SORT_DESC, SORT_ASC и тд можно добится любой сортировки (про них подробнее смотрите в мане), так что это на мой взгляд самый лучший вариант для использования в своих скриптах.
Минусы
??
Плюсы
- Лучшая скорость
- Расширяемость
- Функциональность
A – Сортировка по оценке (параметр grade) (числовая сортировка)
Определим функцию для сортировки массива по оценке (параметр grade):
// Функция сортировки по оценке: сортировка по УБЫВАНИЮ.
function grade_sort($x, $y) {
if ($x < $y) {
return true;
} else if ($x > $y) {
return false;
} else {
return 0;
}
}
Затем возьмем пользовательскую функцию и осуществим перебор двумерного массива PHP по первому ключу. Выглядит это примерно так:
// $students – наш многомерный массив, а grade_sort – созданная функция usort ($students, ' grade_sort ');
Пример:
// Вызвать на печать массив в виде (начальный массив): echo '<h2>Массив в виде</h2><pre>' . print_r($students, 1) . '</pre>'; // Сортировать по оценке (grade): uasort($students, 'grade_sort'); echo '<h2>Массив отсортирован по оценке</h2><pre>' . print_r($students, 1) . '</pre>';
PHP будет отправлять внутренние массивы к этой функции для дальнейшей сортировки. Если вам интересно, как все это происходит в деталях, то выведите на экран результаты сравнения значений внутри функции. А саму функцию после PHP создания двумерного массива измените следующим образом:
function grade_sort($x, $y) {
static $count = 1;
echo “<p>Iteration $count: {$x} vs. {$y} </p> n”;
$count++;
if ($x < $y) {
return true;
} else if ($x > $y) {
return false;
} else {
return 0;
}
}
Выводя на экран значения $x и $y , можно увидеть, как вызывается функция сортировки, определенная пользователем.
Можно сократить функцию grade_sort следующим образом:
// Функция числовой сортировки по оценке: сортировка по УБЫВАНИЮ
function grade_sort($x, $y) {
return ($x < $y);
}
Результаты сортировки двумерного массива PHP по оценке отображены на картинке ниже:
Примечание: Функция usort () сортирует по значениям, но не сохраняет ключи (для внешнего массива). Если ключи нужны, то лучше использовать функцию uasort ().
B – Сортировка по имени (в алфавитном порядке)
Чтобы отсортировать массив $students по первому ключу, необходимо сравнить две строки. Поэтому в примере с сортировкой в алфавитном порядке воспользуемся функция strcasecmp() (не чувствительна к регистру) и strcmp() (чувствительна к регистру). Получившийся двумерный массив PHP будет иметь следующий вид:
// Функция сортировки по имени:
function name_sort($x, $y) {
return strcasecmp($x, $y);
}
Пример:
// Вывести на печать массив в виде (начальный массив): echo '<h2>Массив в виде</h2><pre>' . print_r($students, 1) . '</pre>'; // Сортировка по имени: uasort($students, 'name_sort'); echo '<h2>Массив отсортирован по имени</h2><pre>' . print_r($students, 1) . '</pre>';
На скриншоте, приведенном ниже, показан результат сортировки по имени:
Пожалуйста, оставьте ваши отзывы по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, лайки, подписки!
Sorting on a single field
Sorting associative arrays is really quite simple — IF you know
beforehand which field you want to sort by. For example, to sort by
lastname you can use the usort (user-defined search) function:
The output is as follows:
| index | firstname | lastname | age |
|---|---|---|---|
| James | Brown | 31 | |
| Michael | Davis | 43 | |
| Mary | Johnson | 25 | |
| Amanda | Miller | 18 | |
| Sarah | Miller | 24 | |
| Patrick | Miller | 27 | |
| Patricia | Williams | 7 |
To sort by different fields just replace the
compare_lastname function with a function that orders by
firstname (see below), by age, or any other field in
the associative array. The strnatcmp («natural
order» string comparison) function is handy here as it can be
applied to numbers as well as strings.
Below we will explore using a single function to sort by different
fields by specifying the sort field in the function call. The
comparison function can also be generated on the fly as an anonymous
function.
arsort()- Sort Array in Descending Order, According to Value
Therefore, The following function is used to sorts an associative array in descending order, according to the value.
<?php
$age = array(«Giselle»=>»25», «Amara»=>»15», «Josephine»=>»28», «Penelope»=>»18» );
arsort($age);
foreach($age as $x => $x_value) {
print_r («Key=» . $x . «, Value=» . $x_value);
print_r («<br>»);
}
?>
|
1 |
<?php $age=array(«Giselle»=>»25″,»Amara»=>»15″,»Josephine»=>»28″,»Penelope»=>»18»); arsort($age); foreach($ageas$x=>$x_value){ print_r(«Key=».$x.», Value=».$x_value); print_r(«<br>»); } ?> |
Output:
Key=Josephine, Value=28
Key=Giselle, Value=25
Key=Penelope, Value=18
Key=Amara, Value=15
|
1 |
Key=Josephine,Value=28 Key=Giselle,Value=25 Key=Penelope,Value=18 Key=Amara,Value=15 |