как я могу сортировать массивы и данные в php?

<blockquote> <p>этот вопрос предназначен в качестве справочного материала для вопросов о сортировке массивов в php. легко представить, что ваш конкретный случай уникален и заслуживает нового вопроса, но большинство из них на самом деле являются незначительными вариациями одного из решений на этой странице.</p> <p>если ваш вопрос закрыт как дубликат этого вопроса, пожалуйста, попросите, чтобы ваш вопрос был вновь открыт, только если вы можете объяснить, почему он заметно отличается от всех нижеприведенных.</p> </blockquote><p>как мне отсортировать массив в php?<br> как отсортировать массив <em>complex</em> в php?<br> как отсортировать массив объектов в php?</p><hr><ol> <li><p> <a href="https://stackoverflow.com/a/17364128/476">основные одномерные массивы; включительно многомерные массивы, в т.ч. массивы объектов; включительно сортировка одного массива по другому</a> </p></li> <li><p> <a href="https://stackoverflow.com/a/17364468/476">сортировка с spl</a> </p></li> <li><p> <a href="https://stackoverflow.com/a/17365409">стабильная сортировка</a> </p></li> </ol><p>для практического ответа с использованием существующих функций php см. 1., для академического подробного ответа об алгоритмах сортировки (какие функции php реализуют и которые вам <em>может</em> понадобиться для действительно очень сложных случаев), см. 2.</p>

<h1>основные одномерные массивы</h1><pre><code>$array = array(3, 5, 2, 8); применимые функции сортировки: sort rsort asort arsort natsort natcasesort ksort krsort разница между ними заключается лишь в том, сохраняются ли связи между ключами и значениями (функции «a»), сортируются ли они по возрастанию или наоборот («r»), сортирует ли они значения или ключи («k») и как он сравнивает значения ("nat" против нормального). см. <a href="http://php.net/manual/en/array.sorting.php">http://php.net/manual/en/array.sorting.php для обзора и ссылок на дополнительную информацию.многомерные массивы, в том числе массивы объектов$array = array( array('foo' => 'bar', 'baz' => 42), array('foo' => ..., 'baz' => ...), ... ); </code></pre><p>если вы хотите отсортировать <code>$array по ключу 'foo' каждой записи, вам нужно пользовательская функция сравнения. вышеуказанные sort и связанные функции работают с простыми значениями, которые они умеют сравнивать и сортировать. php не просто «знает», что делать с сложное значение подобно array('foo' => 'bar', 'baz' => 42); так что вы должны сказать это.для этого вам нужно создать функция сравнения. эта функция принимает два элемента и должна возвращать 0, если эти элементы считаются равными, значение ниже 0, если первое значение ниже, и значение выше, чем 0, если первое значение выше. вот и все, что нужно:function cmp(array $a, array $b) { if ($a['foo'] < $b['foo']) { return -1; } else if ($a['foo'] > $b['foo']) { return 1; } else { return 0; } } часто вы захотите использовать <a href="http://php.net/manual/en/functions.anonymous.php">анонимную функцию в качестве обратного вызова. если вы хотите использовать метод или статический метод, см. <a href="http://php.net/manual/en/language.types.callable.php">другие способы указания обратного вызова в php .затем вы используете одну из этих функций:  <a href="http://php.net/usort">usort   <a href="http://php.net/uasort">uasort   <a href="http://php.net/uksort">uksort  опять же, они отличаются только тем, сохраняют ли они сопоставления ключ-значение и сортируют по значениям или ключам. прочитайте их документацию для деталей.пример использования:usort($array, 'cmp'); </code></pre><p><code>usort</code> возьмет два элемента из массива и вызовет с ними вашу функцию <code>cmp</code>. таким образом, <code>cmp()</code> будет вызываться с <code>$a как array('foo' => 'bar', 'baz' => 42) и $b</code> как другая <code>array('foo' => ..., 'baz' => ...)</code>. затем функция возвращает <code>usort</code>, какое из значений было больше или равны ли они. <code>usort</code> повторяет этот процесс, передавая разные значения для <code>$a и $b</code>, пока массив не будет отсортирован. функция <code>cmp</code> будет вызываться много раз, <em>по крайней мере</em> столько раз, сколько есть значений в <code>$array, с различными комбинациями значений для $a</code> и <code>$b каждый раз.чтобы привыкнуть к этой идее, попробуйте это:function cmp($a, $b) { echo 'cmp called with $a:', php\_eol; var\_dump($a); echo 'and $b:', php\_eol; var\_dump($b); } все, что вы сделали, это определили собственный способ сравнения двух элементов, это все, что вам нужно это работает со всеми видами ценностей.кстати, это работает с любым значением, значения не должны быть сложными массивами. если у вас есть пользовательское сравнение, которое вы хотите сделать, вы можете сделать это и на простом массиве чисел.sort сортирует по ссылке и не возвращает ничего полезного!обратите внимание, что массив сортирует на месте, вам не нужно присваивать возвращаемое значение чему-либо. $array = sort($array) заменит массив на true, а не на отсортированный массив. просто sort($array);</code> работает.</p><h2>пользовательские числовые сравнения</h2><p>если вы хотите выполнить сортировку по ключу <code>baz</code>, который является числовым, все, что вам нужно сделать, это:</p><pre><code>function cmp(array $a, array $b) { return $a['baz'] - $b['baz']; } </code></pre><p>благодаря <strong>power of math</strong> это возвращает значение <0, 0 или> 0 в зависимости от того, <code>$a ниже, равен или больше $b</code>.</p><p>обратите внимание, что это не будет хорошо работать для значений <code>float</code>, так как они будут уменьшены до значения <code>int</code> и потеряют точность. вместо этого используйте явные возвращаемые значения <code>-1</code>, <code>0</code> и <code>1</code>.</p><h2>объекты</h2><p>если у вас есть массив объектов, он работает так же:</p><pre><code>function cmp($a, $b) { return $a->baz - $b->baz; } </code></pre><h2>функции</h2><p>внутри функции сравнения вы можете делать все, что вам нужно, в том числе вызывать функции:</p><pre><code>function cmp(array $a, array $b) { return somefunction($a['baz']) - somefunction($b['baz']); } </code></pre><h2>струны</h2><p>ярлык для первой версии сравнения строк:</p><pre><code>function cmp(array $a, array $b) { return strcmp($a['foo'], $b['foo']); } </code></pre><p><code>strcmp</code> делает именно то, что ожидается от <code>cmp</code> здесь, он возвращает <code>-1</code>, <code>0</code> или <code>1</code>.</p><h2>оператор космического корабля</h2><p>в php 7 введен оператор <a href="https://stackoverflow.com/a/31298778/476">космический корабль</a> , который объединяет и упрощает равенство/меньше/больше, чем сравнения между типами:</p><pre><code>function cmp(array $a, array $b) { return $a['foo'] <=> $b['foo']; } </code></pre><h2>сортировка по нескольким полям</h2><p>если вы хотите отсортировать в основном по <code>foo</code>, но если <code>foo</code> равно для двух элементов, сортируйте по <code>baz</code>:</p><pre><code>function cmp(array $a, array $b) { if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) { return $cmp; } else { return $a['baz'] - $b['baz']; } } </code></pre><p>для тех, кто знаком, это эквивалентно запросу sql с <code>order by foo, baz</code>.<br> также см. <a href="https://stackoverflow.com/a/22812695/476">это очень аккуратная сокращенная версия</a> и <a href="https://stackoverflow.com/a/22829326/476">как динамически создать такую функцию сравнения для произвольного числа ключей</a> .</p><h2>сортировка в ручную, статический порядок</h2><p>если вы хотите отсортировать элементы в «ручной порядок», например <em>«foo», «bar», «baz»</em>:</p><pre><code>function cmp(array $a, array $b) { static $order = array('foo', 'bar', 'baz'); return array_search($a['foo'], $order) - array_search($b['foo'], $order); } для всего вышеперечисленного, если вы используете php 5.3 или выше (и вам действительно следует), используйте анонимные функции для более короткого кода и во избежание появления другой глобальной функции:usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; }); </code></pre><p>вот как может быть проста сортировка сложного многомерного массива. опять же, просто подумайте с точки зрения <em>учите php, как определить, какой из двух элементов "больше"</em>; пусть php выполняет фактическую сортировку.также для всего вышеперечисленного, чтобы переключаться между возрастающим и нисходящим порядком, просто поменяйте местами аргументы <code>$a и $b</code>. например.:.</p><p><code>return $a['baz'] - $b['baz']; // ascending return $b['baz'] - $a['baz']; // descending </code></p><pre><code>array\_multisort</code></a> , который позволяет сортировать один массив на основе другого:</h1><p><code>$array1 = array( 4, 6, 1); $array2 = array('a', 'b', 'c'); </code></p><pre><code>$array2 = array('c', 'a', 'b'); // the sorted order of $array1 </code></pre><p><code>array\_multisort($array1, $array2); </code></pre><p><code>array\_multisort(array\_column($array, 'foo'), sort_desc, $array); </code></pre><p>.</p><hr><blockquote> <p><sub>if you have more common cases, feel free to edit this answer.</sub></p> </blockquote>

<p>ну, большинство основных методов уже охвачены <a href="https://stackoverflow.com/a/17364128">deceze</a> я бы попробовал взглянуть на другие типы сортировки.</p><h1>сортировка с spl</h1><h2> <a href="http://php.net/manual/en/class.splheap.php"><code>splheap</code></a> </h2><pre><code>class simpleheapsort extends splheap { public function compare($a, $b) { return strcmp($a, $b); } } // let's populate our heap here (data of 2009) $heap = new simpleheapsort(); $heap->insert("a"); $heap->insert("b"); $heap->insert("c"); echo implode(php\_eol, iterator\_to\_array($heap)); результат c b a  <a href="http://www.php.net/manual/en/class.splmaxheap.php">splmaxheap класс splmaxheap обеспечивает основные функциональные возможности кучи, сохраняя максимум на вершине.$heap = new splmaxheap(); $heap->insert(1); $heap->insert(2); $heap->insert(3);  <a href="http://www.php.net/manual/en/class.splmaxheap.php">splminheap <blockquote> класс splminheap обеспечивает основные функциональные возможности кучи, сохраняя минимум сверху. </blockquote>$heap = new splminheap (); $heap->insert(3); $heap->insert(1); $heap->insert(2); другие виды сортировкипузырьковая сортировкаиз <a href="http://en.wikipedia.org/wiki/bubble_sort">статьи в википедии о bubble sort: <blockquote> пузырьковая сортировка, иногда неправильно называемая тонущей сортировкой, представляет собой простой алгоритм сортировки, который работает путем многократного пошагового перемещения по списку для сортировки, сравнения каждой пары смежных элементов и их замены, если они расположены в неправильном порядке. проход по списку повторяется до тех пор, пока не понадобятся перестановки, что указывает на то, что список отсортирован. алгоритм получил свое название от того, как меньшие элементы «всплывают» в верхнюю часть списка. поскольку он использует только сравнения для работы с элементами, это сортировка сравнения. хотя алгоритм прост, большинство других алгоритмов сортировки более эффективны для больших списков. </blockquote>function bubblesort(array $array) { $array_size = count($array); for($i = 0; $i < $array_size; $i ++) { for($j = 0; $j < $array_size; $j ++) { if ($array[$i] < $array[$j]) { $tem = $array[$i]; $array[$i] = $array[$j]; $array[$j] = $tem; } } } return $array; } сортировка выбораиз <a href="http://en.wikipedia.org/wiki/selection_sort">статьи в википедии о сортировке выбора: <blockquote> в информатике сортировка по выбору является алгоритмом сортировки, в частности, сортировкой по месту. он имеет o(n2) временную сложность, что делает его неэффективным в больших списках, и, как правило, работает хуже, чем аналогичная сортировка вставки. сортировка выбора отличается простотой и имеет преимущества в производительности по сравнению с более сложными алгоритмами в определенных ситуациях, особенно в тех случаях, когда вспомогательная память ограничена. </blockquote>function selectionsort(array $array) { $length = count($array); for($i = 0; $i < $length; $i ++) { $min = $i; for($j = $i + 1; $j < $length; $j ++) { if ($array[$j] < $array[$min]) { $min = $j; } } $tmp = $array[$min]; $array[$min] = $array[$i]; $array[$i] = $tmp; } return $array; } </code></pre><h2>вид вставки</h2><p>из <a href="http://en.wikipedia.org/wiki/insertion\_sort">статьи в википедии о сортировке вставок:</a> </p><blockquote> <p>вставка сортировки - это простой алгоритм сортировки, который создает окончательный отсортированный массив (или список) по одному элементу за раз. он гораздо менее эффективен в больших списках, чем более продвинутые алгоритмы, такие как быстрая сортировка, heapsort или сортировка слиянием. тем не менее, вставка сортировки обеспечивает несколько преимуществ:</p> </blockquote><pre><code>function insertionsort(array $array) { $count = count($array); for($i = 1; $i < $count; $i ++) { $j = $i - 1; // second element of the array $element = $array[$i]; while ( $j >= 0 && $array[$j] > $element ) { $array[$j + 1] = $array[$j]; $array[$j] = $element; $j = $j - 1; } } return $array; } </code></pre><h2>shellsort</h2><p>из <a href="http://en.wikipedia.org/wiki/shellsort">статьи в википедии о shellsort:</a> </p><blockquote> <p>shellsort, также известный как сортировка shell или метод shell, является сортировкой сравнения на месте. он обобщает обменную сортировку, такую как вставка или пузырьковая сортировка, начиная сравнение и обмен элементами с элементами, которые находятся далеко друг от друга, прежде чем заканчивать соседними элементами. </p> </blockquote><pre><code>function shellsort(array $array) { $gaps = array( 1, 2, 3, 4, 6 ); $gap = array_pop($gaps); $length = count($array); while ( $gap > 0 ) { for($i = $gap; $i < $length; $i ++) { $tmp = $array[$i]; $j = $i; while ( $j >= $gap && $array[$j - $gap] > $tmp ) { $array[$j] = $array[$j - $gap]; $j -= $gap; } $array[$j] = $tmp; } $gap = array\_pop($gaps); } return $array; } </code></pre><h2>расческа</h2><p>из <a href="http://en.wikipedia.org/wiki/comb\_sort">статьи в википедии о сортировке расчески:</a> </p><blockquote> <p>сортировка с использованием гребней - это относительно простой алгоритм сортировки, первоначально разработанный влодзимежем добосевичем в 1980 году. позднее он был вновь открыт стивеном лейси и ричардом боксом в 1991 году. сортировка с использованием гребней улучшает сортировку по пузырькам.</p> </blockquote><pre><code>function combsort(array $array) { $gap = count($array); $swap = true; while ( $gap > 1 || $swap ) { if ($gap > 1) $gap /= 1.25; $swap = false; $i = 0; while ( $i + $gap < count($array) ) { if ($array[$i] > $array[$i + $gap]) { // swapping the elements. list($array[$i], $array[$i + $gap]) = array( $array[$i + $gap], $array[$i] ); $swap = true; } $i ++; } } return $array; } сортировка слияниемfrom <a href="http://en.wikipedia.org/wiki/merge_sort">статья в википедии о сортировке слиянием: <blockquote> в информатике сортировка слиянием (также обычно пишется как mergesort) представляет собой алгоритм сортировки, основанный на сравнении o (n log n). большинство реализаций производят стабильную сортировку, что означает, что реализация сохраняет порядок ввода одинаковых элементов в отсортированном выводе. </blockquote>function mergesort(array $array) { if (count($array) <= 1) return $array; $left = mergesort(array_splice($array, floor(count($array) / 2))); $right = mergesort($array); $result = array(); while ( count($left) > 0 && count($right) > 0 ) { if ($left[0] <= $right[0]) { array\_push($result, array_shift($left)); } else { array\_push($result, array_shift($right)); } } while ( count($left) > 0 ) array_push($result, array\_shift($left)); while ( count($right) > 0 ) array\_push($result, array_shift($right)); return $result; } quicksortиз <a href="http://en.wikipedia.org/wiki/quicksort">статья в википедии о быстрой сортировке: <blockquote> быстрая сортировка, или сортировка по разделу, - это алгоритм сортировки, разработанный тони хоаром, который в среднем производит o (n log n) сравнений для сортировки n элементов. в худшем случае выполняется сравнение o(n2), хотя такое поведение встречается редко. </blockquote>function quicksort(array $array) { if (count($array) == 0) { return $array; } $pivot = $array[0]; $left = $right = array(); for($i = 1; $i < count($array); $i ++) { if ($array[$i] < $pivot) { $left[] = $array[$i]; } else { $right[] = $array[$i]; } } return array_merge(quicksort($left), array( $pivot ), quicksort($right)); } </code></pre><h2>перестановка сортировки</h2><p>from <a href="http://rosettacode.org/wiki/sorting\_algorithms/permutation\_sort">статья в википедии о перестановочной сортировке:</a> </p><blockquote> <p>сортировка перестановок, которая продолжается путем генерации возможных перестановок входного массива/списка до обнаружения отсортированной.</p> </blockquote><pre><code>function permutationsort($items, $perms = array()) { if (empty($items)) { if (inorder($perms)) { return $perms; } } else { for($i = count($items) - 1; $i >= 0; -- $i) { $newitems = $items; $newperms = $perms; list($foo) = array\_splice($newitems, $i, 1); array\_unshift($newperms, $foo); $res = permutationsort($newitems, $newperms); if ($res) { return $res; } } } } function inorder($array) { for($i = 0; $i < count($array); $i ++) { if (isset($array[$i + 1])) { if ($array[$i] > $array[$i + 1]) { return false; } } } return true; } </code></pre><h2>radix sort</h2><p>из <a href="http://en.wikipedia.org/wiki/radix\_sort">статьи в википедии о сортировке radix:</a> </p><blockquote> <p>в компьютерных науках радикальная сортировка - это не сравнительный алгоритм целочисленной сортировки, который сортирует данные по целочисленным ключам путем группировки ключей по отдельным цифрам, которые имеют одинаковую значимую позицию и значение. </p> </blockquote><pre><code>// radix sort for 0 to 256 function radixsort($array) { $n = count($array); $partition = array(); for($slot = 0; $slot < 256; ++ $slot) { $partition[] = array(); } for($i = 0; $i < $n; ++ $i) { $partition[$array[$i]->age & 0xff][] = &$array[$i]; } $i = 0; for($slot = 0; $slot < 256; ++ $slot) { for($j = 0, $n = count($partition[$slot]); $j < $n; ++ $j) { $array[$i ++] = &$partition[$slot][$j]; } } return $array; } </code></pre>

<h1>стабильный сорт</h1><p>допустим, у вас есть такой массив:</p><pre><code>['kale', 'kaleidoscope', 'aardvark', 'apple', 'leicester', 'lovely'] </code></pre><p>а теперь вы хотите отсортировать только по первой букве:</p><pre><code>usort($array, function($a, $b) { return strcmp($a[0], $b[0]); }); результат таков:['apple', 'aardvark', 'kale', 'kaleidoscope', 'lovely', 'leicester'] <strong>сортировка не была стабильной!</strong>зоркий наблюдатель, возможно, заметил, что алгоритм сортировки массива (quicksort) не дал стабильного результата и что первоначальный порядок между словами одной и той же первой буквы не сохранился. этот случай тривиален, и мы должны были сравнить всю строку, но давайте предположим, что ваш вариант использования более сложный, например, два последовательных сортировки по разным полям, которые не должны отменять работу друг друга.<strong>преобразование шварца</strong> <a href="https://en.wikipedia.org/wiki/schwartzian_transform">преобразование шварца , также называемое идиомой decorate-sort-undecorate, обеспечивает устойчивую сортировку с помощью изначально нестабильного алгоритма сортировки.сначала вы украшаете каждый элемент массива другим массивом, содержащим первичный ключ (значение) и вторичный ключ (его индекс или позицию):array_walk($array, function(&$element, $index) { $element = array($element, $index); // decorate }); это преобразует массив в это:[ ['kale', 0], ['kaleidoscope', 1], ['aardvark', 2], ['apple', 3], ['leicester', 4], ['lovely', 5] ] теперь настроим шаг сравнения; мы снова сравниваем первую букву, но если они совпадают, вторичный ключ используется для сохранения первоначального порядка:usort($array, function($a, $b) { // $a[0] and $b[0] contain the primary sort key // $a[1] and $b[1] contain the secondary sort key $tmp = strcmp($a[0][0], $b[0][0]); if ($tmp != 0) { return $tmp; // use primary key comparison results } return $a[1] - $b[1]; // use secondary key }); после этого мы декорируем:array_walk($array, function(&$element) { $element = $element[0]; }); конечный результат:['aardvark', 'apple', 'kale', 'kaleidoscope', 'leicester', 'lovely'] <strong>а как насчет повторного использования?</strong>вы должны были переписать свою функцию сравнения для работы с преобразованными элементами массива; вы можете не захотеть редактировать свои тонкие функции сравнения, поэтому вот обертка для функции сравнения:function stablecmp($fn) { return function($a, $b) use ($fn) { if (($tmp = call\_user\_func($fn, $a[0], $b[0])) != 0) { return $tmp; } else { return $a[1] - $b[1]; } }; } </code></pre><p>давайте напишем шаг сортировки, используя эту функцию:</p><pre><code>usort($array, stablecmp(function($a, $b) { return strcmp($a[0], $b[0]); })); вуаля! ваш первоначальный код сравнения вернулся.

начиная с php 5.3 с замыканиями, также можно использовать замыкание для определения порядка вашего рода.например, предположим, что $ array является массивом объектов, которые содержат свойство month.</p><pre><code> $orderarray = array("jan","feb","mar","apr","may","june","july","aug","sept","oct","nov","dec"); usort($array, function($a, $b) use ($orderarray){ return array_search($a->month, $orderarray) - array_search($b->month, $orderarray); }); 

linqв .net linq часто используется для сортировки, что обеспечивает более приятный синтаксис по сравнению с функциями сравнения, особенно когда объекты должны быть отсортированы по нескольким полям. существует несколько портов linq to php, в том числе <a href="https://github.com/athari/yalinqo">yalinqo library . с его помощью массивы можно сортировать одной строкой без написания сложных функций сравнения.$sortedbyname = from($objects)->orderby('$v->name'); $sortedbycount = from($objects)->orderby('$v->count'); $sortedbycountandname = from($objects)->orderby('$v->count')->thenby('$v->name'); сравнения могут быть дополнительно настроены путем передачи обратного вызова в качестве второго аргумента, например:$sortedbyfilenamenat = from($objects)->orderby('$v->filename', 'strnatcmp'); </code></pre><p>здесь <code>'$v->count' является сокращением для function ($v) { return $v->count; } (может использоваться любой из них). эти цепочки методов возвращают итераторы, итераторы могут быть преобразованы в массивы путем добавления ->toarray() в конце, если это необходимо.внутренне orderby и связанные методы вызывают соответствующие функции сортировки массива (uasort, krsort, multisort, usort и т.д.).linq содержит гораздо больше методов, основанных на sql: фильтрация, группирование, объединение, агрегирование и т.д. он лучше всего подходит для случаев, когда необходимо выполнять сложные преобразования массивов и объектов без использования баз данных. разработанный мной, см. readme для более подробной информации и сравнения с другими портами linq

<strong> многомерная сортировка по значению ключа </strong>естественная сортировка многомерного массива по значению ключа, а также сохранение исходного порядка (не перемешивайте основные ключи):function multisortbykeyvalue( $k, $arr ) { $ids = array(); $index = 1; foreach ( $arr as $key => $row ) { $ids[ $key ] = intval( $row[ $k ] ) . '-' . $index . '-' . $key; $index ++; } natsort( $ids ); $arr = array_merge( $ids, $arr ); return $arr; } </code></pre><p><strong> прецедент: </strong></p><pre><code>$arr = array( 'id1' => array( 'label' => 'id 1', 'priority' => 30, ), 'id2' => array( 'label' => 'id 2', 'priority' => 70, ), 'id3' => array( 'label' => 'id 3', 'priority' => 20, ), 'id4' => array( 'label' => 'id 4', 'priority' => 30, ), ); $sorted = multisortbykeyvalue( 'priority', $arr ); // $sorted equals to: /* array ( 'id3' => array ( 'label' => 'id 3', 'priority' => 20, ), 'id1' => array ( 'label' => 'id 1', 'priority' => 30, ), 'id4' => array ( 'label' => 'id 4', 'priority' => 30, ), 'id2' => array ( 'label' => 'id 2', 'priority' => 70, ), ) */ </code></pre>

<p>очень удобно сортировать массивы с помощью <a href="https://github.com/ihor/nspl#sortedarray-array-reversed--false-key--null-cmp--null">sorted</a> function from <a href="https://github.com/ihor/nspl">nspl</a> :</p><p><strong>основная сортировка</strong></p><pre><code>// sort array $sorted = sorted([3, 1, 2]); // sort array in descending order $sorteddesc = sorted([3, 1, 2], true); </code></pre><p><strong>сортировка по результату функции</strong></p><pre><code>// sort array by the result of a given function (order words by length) $sortedbylength = sorted(['bc', 'a', 'abc'], 'strlen'); $sortedbylengthdesc = sorted(['bc', 'a', 'abc'], true, 'strlen'); // sort array by the result of user-defined function (order words by the 1st character) $sortedbythefirstcharacter = sorted(['bc', 'a', 'abc'], function($v) { return $v[0]; }); // which is the same as $sortedbythefirstcharacter = sorted(['bc', 'a', 'abc'], itemgetter(0)); $sortedbythefirstcharacterdesc = sorted(['bc', 'a', 'abc'], true, itemgetter(0)); // itemgetter(0) returns a function which takes an argument with access by index/key // and returns the value at index 0 <strong>сортировка многомерного массива</strong>// sort multidimensional array (sort list of users by their names) $users = [ array('name' => 'robert', 'age' => 20), array('name' => 'alex', 'age' => 30), array('name' => 'jack', 'age' => 25), ]; $sortedbyname = sorted($users, itemgetter('name')); $sortedbynamedesc = sorted($users, true, itemgetter('name')); // itemgetter('name') returns a function which takes an argument with access by index/key // and returns the value of the 'name' key </code></pre><p><strong>сортировка массива объектов</strong></p><pre><code>// lets assume we have class user(name, age) with properties name and age // and public methods getname() and getage() $users = [ new user('robert', 20), new user('alex', 30), new user('jack', 25), ]; // sort list of objects by property value (sort list of users by their name) $sortedbyname = sorted($users, propertygetter('name')); $sortedbynamedesc = sorted($users, true, propertygetter('name')); // propertygetter('name') returns a function which takes an object // and returns the value of its 'name' property // sort list of objects by method result (sort list of users by their age) $sortedbyage = sorted($users, methodcaller('getage')); $sortedbyagedesc = sorted($users, true, methodcaller('getage')); // methodcaller('getage') returns a function which takes an object // and returns the result of its getage() method <strong>сортировка с помощью функции сравнения</strong>// sort with a comparison function (order words lexicographically with strcmp) $sortedlexicographically = sorted(['bc', 'a', 'abc'], false, null, 'strcmp'); // sort with user-defined comparison function (order words by the 1st character) $sortedbythefirstcharacter = sorted(['bc', 'a', 'abc'], false, null, function($v1, $v2) { return chr($v1[0]) - chr($v2[0]); }); вы можете увидеть все эти примеры <a href="https://github.com/ihor/nspl/blob/master/examples/a_sorted.php">здесь .

существует несколько способов сортировки массива. я упомяну некоторые методы для выполнения этой задачи. из всех я приведу целочисленный массив, который называется «$ numbers».</p><pre><code>$number = array(8,9,3,4,0,1,2); это нормальный способ создания массива. предположим, что я хочу отсортировать этот массив в порядке возрастания. для этого можно использовать метод sort ().<?php $number = array(8,9,3,4,0,1,2); sort($number); foreach ($number as $value) { echo $value." "; } ?> </code></pre><p>теперь рассмотрим вывод этого,</p><p> <a href="https://i.stack.imgur.com/lvih0.jpg"> <img src="https://i.stack.imgur.com/lvih0.jpg" alt="enter image description here"> </a> </p><p>вы можете видеть, что напечатанный массив чисел отсортирован. если вы хотите, чтобы этот числовой массив сортировался в порядке убывания, для этой задачи можно использовать метод rsort ().</p><pre><code><?php $number = array(8,9,3,4,0,1,2); rsort($number); foreach ($number as $value) { echo $value." "; } ?> рассмотреть вывод .. <a href="https://i.stack.imgur.com/n1pwx.jpg"> <img src="https://i.stack.imgur.com/n1pwx.jpg" alt="enter image description here">  теперь массив отсортирован в порядке убывания. хорошо, давайте рассмотрим ассоциативный массив. я дам ассоциативный массив (ассоциативный массив означает, что массив, каждый индекс которого имеет уникальное значение ключа).$number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2); </code></pre><p>итак, теперь я хочу отсортировать этот массив в порядке возрастания в соответствии с их значением. для этого можно использовать метод 'asort ()'.</p><pre><code><?php $number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2); asort($number); foreach ($number as $value) { echo $value." "; } ?> при сортировке в порядке убывания по их значению можно использовать метод «arsort ()». предположим, вы хотите отсортировать этот массив по значению ключа. в этом случае можно использовать метод ksort ().<?php $number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2); ksort($number); foreach ($number as $value) { echo $value." "; } ?> </code></pre><p>теперь рассмотрим вывод . <a href="https://i.stack.imgur.com/p0zkr.jpg"> <img src="https://i.stack.imgur.com/p0zkr.jpg" alt="enter image description here"> </a> </p><p>теперь массив сортируется по значению ключа. если вы хотите отсортировать массив в порядке убывания по значению ключа, можно использовать метод krsort ().</p><pre><code><?php $number = array('eight'=>8,'nine'=>9,'three'=>3,'fore'=>4,'zero'=>0,'one'=>1,'two'=>2); krsort($number); foreach ($number as $value) { echo $value." "; } ?> </code></pre><p>теперь ассоциативный массив сортируется в порядке убывания по значению ключа. смотрите на выходе . <a href="https://i.stack.imgur.com/8sqgb.jpg"> <img src="https://i.stack.imgur.com/8sqgb.jpg" alt="enter image description here"> </a> </p><p>вот некоторые методы сортировки массива в порядке возрастания или убывания в php. я надеюсь, что вы могли бы получить представление. спасибо!</p>