Sort php в обратном порядке

Сортировка массивов в php: ksort, asort и прочие sort’ы

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

Допустим у нас есть массив

$arr = [ 2 => 'Виноград', 1 => 'Арбуз', 3 => 'Банан', ];

Он неправильно отсортирован, как видите ключи (1,2,3) и значения (виноград, арбуз, банан) идут не по порядку. Давайте это исправим:

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

ksort($arr); // По возрастанию krsort($arr); // По убыванию

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

sort($arr);// По возрастанию asort($arr);// По возрастанию, сохраняет ключи rsort($arr); // По убыванию arsort($arr); // По убыванию, сохраняет ключи array_reverse($arr); // От конца к началу array_reverse($arr, true); // От конца к началу, сохраняет ключи shuffle($arr); // Перемешать массив в случайном порядке

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

Если предложенные способы сортировки вам не подходят, то можно создать свой способ сортировки ключей и значений массивов. Для этого есть 3 функции uasort, uksort и usort. С их помощью мы можем задать свою callback функцию, которая будет сравнивать элементы между собой и определять какой из них «больше» и какой «меньше».

  • uasort — Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей
  • uksort — Сортирует массив по ключам, используя пользовательскую функцию для сравнения ключей
  • usort — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
Читайте также:  Color scheme html css

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

Давайте рассмотрим как они работают напримере функции uasort, которая сравнивает значения с сохранением ключей.

// Наша функция сравнения $callbackCmpFunction = function cmp($a, $b) < if ($a == $b) < // если 2 значения массива равны return 0; // вернем 0 >return ($a

  • -1 — возвращается, когда элемент, который слева больше правого
  • 0 — когда элементы равны
  • 1 — когда правый больше левого

Применить нашу новую функцию можно так:

// Сортируемый массив $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4); print_r($array); // Сортируем и выводим получившийся массив uasort($array, $callbackCmpFunction); // вторым параметром указываем нашу callback функцию print_r($array);

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

Функции без сохранения ключей sort и rsort, сбрасывают ключи и они начинают идти по порядку (0, 1, 2, . )

Иногда бывает полезно одно, иногда — другое. В зависимости от задачи.

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

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

Флаг сортировки передается в функцию сортировки, например так:

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

Создадим функцию, которая нам поможет в сортировке массивов

// создадим функцию которая нам поможет в сортировке массивов function array_orderby() < $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_orderby() :

$data = [ ['volume' => 67, 'edition' => 2], ['volume' => 86, 'edition' => 1], ['volume' => 85, 'edition' => 6], ['volume' => 98, 'edition' => 2], ['volume' => 86, 'edition' => 6], ['volume' => 67, 'edition' => 7], ]; // Сортируем массив $data сначала по volume, затем по edition $sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC); // SORT_ASC - по возрастанию // SORT_DESC - по убыванию print_r($sorted); // выводим результат

Если вам нужно что-то совсем уж специфическое при сортировки многомерных массивов

Можете создать и другие callback функции сортировки самостоятельно.

$data = [ ['volume' => 67, 'edition' => 2], ['volume' => 86, 'edition' => 1], ['volume' => 85, 'edition' => 6], ['volume' => 98, 'edition' => 2], ['volume' => 86, 'edition' => 6], ['volume' => 67, 'edition' => 7], ]; // Создадим 2 функции function cmp_function($a, $b) < // volume по возрастанию return ($a['volume'] >$b['volume']); > function cmp_function_desc($a, $b) < // volume по убыванию return ($a['volume'] < $b['volume']); >uasort($array, 'cmp_function'); // сортируем по возрастанию, по полю count uasort($array, 'cmp_function_desc'); // сортируем по убыванию, по полю count

Массивы на «стероидах»

Часто работаете с массивами? Тогда вам понравится это расширение для работы с коллекциями.

Рассмотрим несколько примеров.

$collection = collect([5, 3, 1, 2, 4]); $sorted = $collection->sort(); $sorted->values()->all(); // [1, 2, 3, 4, 5]

Сортировка по одной «колонке» ассоциативного массива:

$collection = collect([ ['name' => 'Desk', 'price' => 200], ['name' => 'Chair', 'price' => 100], ['name' => 'Bookcase', 'price' => 150], ]); $sorted = $collection->sortBy('price'); $sorted->values()->all(); /* [ ['name' => 'Chair', 'price' => 100], ['name' => 'Bookcase', 'price' => 150], ['name' => 'Desk', 'price' => 200], ] */

Сортировка по нескольким аттрибутам одновременно:

$collection = collect([ ['name' => 'Taylor Otwell', 'age' => 34], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Abigail Otwell', 'age' => 32], ]); $sorted = $collection->sortBy([ ['name', 'asc'], ['age', 'desc'], ]); $sorted->values()->all(); /* [ ['name' => 'Abigail Otwell', 'age' => 32], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Taylor Otwell', 'age' => 34], ] */

Вы также можете использовать свои функции сортировки при работе с коллекциями:

$collection = collect([ ['name' => 'Taylor Otwell', 'age' => 34], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Abigail Otwell', 'age' => 32], ]); $sorted = $collection->sortBy([ fn ($a, $b) => $a['name'] $b['name'], fn ($a, $b) => $b['age'] $a['age'], ]); $sorted->values()->all(); /* [ ['name' => 'Abigail Otwell', 'age' => 32], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Taylor Otwell', 'age' => 34], ] */

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

Изучите документацию и вы влюбитесь в коллекции.

Если у вас есть вопросы или вы нашли ошибку — пишите в комментариях.

Источник

rsort

Замечание:

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

Замечание: Эта функция присваивает новые ключи элементам array . Она удалит все существующие ключи, а не просто переупорядочит их.

Замечание:

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

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

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

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

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

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

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

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

Примеры

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

$fruits = array( «lemon» , «orange» , «banana» , «apple» );
rsort ( $fruits );
foreach ( $fruits as $key => $val ) echo » $key = $val \n» ;
>
?>

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

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

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

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

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

User Contributed Notes 6 notes

A cleaner (I think) way to sort a list of files into reversed order based on their modification date.

$path = $_SERVER [ DOCUMENT_ROOT ]. «/files/» ;
$dh = @ opendir ( $path );

while ( false !== ( $file = readdir ( $dh )))
if ( substr ( $file , 0 , 1 )!= «.» )
$files []=array( filemtime ( $path . $file ), $file ); #2-D array
>
closedir ( $dh );

if ( $files )
rsort ( $files ); #sorts by filemtime

#done! Show the files sorted by modification date
foreach ( $files as $file )
echo » $file [ 0 ] $file [ 1 ]
\n» ; #file[0]=Unix timestamp; file[1]=filename
>
?>

Like sort(), rsort() assigns new keys for the elements in array. It will remove any existing keys you may have assigned, rather than just reordering the keys. This means that it will destroy associative keys.

$animals = array(«dog»=>»large», «cat»=>»medium», «mouse»=>»small»);
print_r($animals);
//Array ( [dog] => large [cat] => medium [mouse] => small )

rsort($animals);
print_r($animals);
//Array ( [0] => small [1] => medium [2] => large )

Use KSORT() or KRSORT() to preserve associative keys.

I needed a function that would sort a list of files into reversed order based on their modification date.

Here’s what I came up with:

$f = array();
if (is_dir($dir)) if ($dh = opendir($dir)) while (($folder = readdir($dh)) !== false) if (preg_match(«/\s*$ext$/», $folder)) $fullpath = «$dir/$folder»;
$mtime = filemtime ($fullpath);

$ff = array($mtime => $fullpath);
$f = array_merge($f, $ff);

while (list($key, $val) = each($f)) $fcontents = file($val, «r»);
while (list($key, $val) = each($fcontents))
echo «$val\n»;
>

Источник

rsort

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

Замечание:

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

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

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

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

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

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

Примеры

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

$fruits = array( «lemon» , «orange» , «banana» , «apple» );
rsort ( $fruits );
foreach ( $fruits as $key => $val ) echo » $key = $val \n» ;
>
?>

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

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

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

Примечания

Замечание: Эта функция присваивает новые ключи элементам array . Она удалит все существующие ключи, а не просто переупорядочит их.

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

  • arsort() — Сортирует массив в обратном порядке, сохраняя ключи
  • krsort() — Сортирует массив по ключам в обратном порядке
  • Сравнение функций сортировки массивов

Источник

Оцените статью