# How can I sort arrays and data in PHP?

Due to the enormous and ever repeating amount of

"How do I sort my unique snowflake of an array?"questions, this is a reference collection of basic sorting methods in PHP. Please close any question which does not markedly differ as a duplicate of this one.

How do I sort an array in PHP?

How do I sort a *complex* array in PHP?

How do I sort an array of objects in PHP?

For the practical answer using PHP's existing functions see 1., for the academic in-detail answer on sorting algorithms (which PHP's functions implement and which you *may* need for really, really complex cases), see 2.

# Stable sort

Let's say you have an array like this:

`['Kale', 'Kaleidoscope', 'Aardvark', 'Apple', 'Leicester', 'Lovely'] `

And now you want to sort on the first letter only:

`usort($array, function($a, $b) { return strcmp($a[0], $b[0]); }); `

The outcome is this:

`['Apple', 'Aardvark', 'Kale', 'Kaleidoscope', 'Lovely', 'Leicester'] `

**The sort wasn't stable!**

The keen observer may have noticed that the array sorting algorithm (QuickSort) didn't produce a stable outcome and that the original order between words of the same first letter wasn't preserved. This case is trivial and we should have compared the whole string, but let's assume your use-case is more complicated, such as two consecutive sorts on different fields that shouldn't cancel out each other's work.

**The Schwartzian transform**

The Schwartzian transform, also referred to as the decorate-sort-undecorate idiom, effects a stable sort with an inherently unstable sorting algorithm.

First, you decorate each array element with another array comprising a primary key (the value) and a secondary key (its index or position):

`array_walk($array, function(&$element, $index) { $element = array($element, $index); // decorate }); `

This transforms the array into this:

`[ ['Kale', 0], ['Kaleidoscope', 1], ['Aardvark', 2], ['Apple', 3], ['Leicester', 4], ['Lovely', 5] ] `

Now, we adjust the comparison step; we compare the first letter again, but if they're the same, the secondary key is used to retain the original ordering:

`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 }); `

Afterwards, we undecorate:

`array_walk($array, function(&$element) { $element = $element[0]; }); `

The final result:

`['Aardvark', 'Apple', 'Kale', 'Kaleidoscope', 'Leicester', 'Lovely'] `

**What about reuse?**

You had to rewrite your comparison function to work with the transformed array elements; you may not want to edit your delicate comparison functions, so here's a wrapper for the comparison function:

`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]; } }; } `

Let's write the sort step using this function:

`usort($array, stablecmp(function($a, $b) { return strcmp($a[0], $b[0]); })); `

Voila! Your pristine comparison code is back.

Well most basic methods are already covered by deceze I would try to look at other types of sort

# Sorting with SPL

`SplHeap`

`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)); `

Output

`c b a `

`SplMaxHeap`

The SplMaxHeap class provides the main functionalities of a heap, keeping the maximum on the top.

`$heap = new SplMaxHeap(); $heap->insert(1); $heap->insert(2); $heap->insert(3); `

`SplMinHeap`

The SplMinHeap class provides the main functionalities of a heap, keeping the minimum on the top.

`$heap = new SplMinHeap (); $heap->insert(3); $heap->insert(1); $heap->insert(2); `

## Other Types of Sort

## Bubble Sort

From the Wikipedia article on Bubble Sort:

Bubble sort, sometimes incorrectly referred to as sinking sort, is a simple sorting algorithm that works by repeatedly stepping through the list to be sorted, comparing each pair of adjacent items and swapping them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which indicates that the list is sorted. The algorithm gets its name from the way smaller elements "bubble" to the top of the list. Because it only uses comparisons to operate on elements, it is a comparison sort. Although the algorithm is simple, most of the other sorting algorithms are more efficient for large lists.

`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; } `

## Selection sort

From the Wikipedia article on Selection sort:

In computer science, selection sort is a sorting algorithm, specifically an in-place comparison sort. It has O(n2) time complexity, making it inefficient on large lists, and generally performs worse than the similar insertion sort. Selection sort is noted for its simplicity, and it has performance advantages over more complicated algorithms in certain situations, particularly where auxiliary memory is limited.

`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; } `

## Insertion sort

From the Wikipedia article on Insertion sort:

Insertion sort is a simple sorting algorithm that builds the final sorted array (or list) one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort. However, insertion sort provides several advantages:

`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; } `

## Shellsort

From the Wikipedia article on Shellsort:

Shellsort, also known as Shell sort or Shell's method, is an in-place comparison sort. It generalizes an exchanging sort, such as insertion or bubble sort, by starting the comparison and exchange of elements with elements that are far apart before finishing with neighboring elements.

`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; } `

## Comb sort

From the Wikipedia article on Comb sort:

Comb sort is a relatively simple sorting algorithm originally designed by Wlodzimierz Dobosiewicz in 1980. Later it was rediscovered by Stephen Lacey and Richard Box in 1991. Comb sort improves on bubble sort.

`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; } `

## Merge sort

From the Wikipedia article on Merge sort:

In computer science, a merge sort (also commonly spelled mergesort) is an O(n log n) comparison-based sorting algorithm. Most implementations produce a stable sort, which means that the implementation preserves the input order of equal elements in the sorted output

`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

From the Wikipedia article on Quicksort:

Quicksort, or partition-exchange sort, is a sorting algorithm developed by Tony Hoare that, on average, makes O(n log n) comparisons to sort n items. In the worst case, it makes O(n2) comparisons, though this behavior is rare.

`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)); } `

## Permutation sort

From the Wikipedia article on Permutation sort:

Permutation sort, which proceeds by generating the possible permutations of the input array/list until discovering the sorted one.

`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; } `

## Radix sort

From the Wikipedia article on Radix sort:

In computer science, radix sort is a non-comparative integer sorting algorithm that sorts data with integer keys by grouping keys by the individual digits which share the same significant position and value.

`// 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; } `

As of PHP 5.3 with closures it is also possible to use a closure to determine the order of your sort.

For example assuming $array is an array of objects that contain a month property.

` $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); }); `

*'s answer is*

**accepted**# Basic one dimensional arrays

`$array = array(3, 5, 2, 8); `

Applicable sort functions:

`sort`

`rsort`

`asort`

`arsort`

`natsort`

`natcasesort`

`ksort`

`krsort`

The difference between those is merely whether key-value associations are kept (the "`a`

" functions), whether it sorts low-to-high or reverse ("`r`

"), whether it sorts values or keys ("`k`

") and how it compares values ("`nat`

" vs. normal). See http://php.net/manual/en/array.sorting.php for an overview and links to further details.

# Multi dimensional arrays, including arrays of objects

`$array = array( array('foo' => 'bar', 'baz' => 42), array('foo' => ..., 'baz' => ...), ... ); `

If you want to sort `$array`

by the key 'foo' of each entry, you need a *custom comparison function*. The above `sort`

and related functions work on simple values that they know how to compare and sort. PHP does not simply "know" what to do with a *complex value* like `array('foo' => 'bar', 'baz' => 42)`

though; so you need to tell it.

To do that, you need to create a *comparison function*. That function takes two elements and must return `0`

if these elements are considered equal, a value lower than `0`

if the first value is lower and a value higher than `0`

if the first value is higher. That's all that's needed:

`function cmp(array $a, array $b) { if ($a['foo'] < $b['foo']) { return -1; } else if ($a['foo'] > $b['foo']) { return 1; } else { return 0; } } `

Often, you will want to use an anonymous function as the callback. If you want to use a method or static method, see the other ways of specifying a callback in PHP.

You then use one of these functions:

Again, they only differ in whether they keep key-value associations and sort by values or keys. Read their documentation for details.

Example usage:

`usort($array, 'cmp'); `

`usort`

will take two items from the array and call your `cmp`

function with them. So `cmp()`

will be called with `$a`

as `array('foo' => 'bar', 'baz' => 42)`

and `$b`

as another `array('foo' => ..., 'baz' => ...)`

. The function then returns to `usort`

which of the values was larger or whether they were equal. `usort`

repeats this process passing different values for `$a`

and `$b`

until the array is sorted. The `cmp`

function will be called many times, *at least* as many times as there are values in `$array`

, with different combinations of values for `$a`

and `$b`

every time.

To get used to this idea, try this:

`function cmp($a, $b) { echo 'cmp called with $a:', PHP_EOL; var_dump($a); echo 'and $b:', PHP_EOL; var_dump($b); } `

All you did was define a custom way to compare two items, that's all you need. That works with all sorts of values.

By the way, this works on any value, the values don't have to be complex arrays. If you have a custom comparison you want to do, you can do it on a simple array of numbers too.

`sort`

sorts by reference and does not return anything useful!

Note that the array sorts *in place*, you do not need to assign the return value to anything. `$array = sort($array)`

will replace the array with `true`

, not with a sorted array. Just `sort($array);`

works.

## Custom numeric comparisons

If you want to sort by the `baz`

key, which is numeric, all you need to do is:

`function cmp(array $a, array $b) { return $a['baz'] - $b['baz']; } `

Thanks to **The PoWEr oF MATH** this returns a value < 0, 0 or > 0 depending on whether `$a`

is lower than, equal to or larger than `$b`

.

Note that this won't work well for `float`

values, since they'll be reduced to an `int`

and lose precision. Use explicit `-1`

, `0`

and `1`

return values instead.

## Objects

If you have an array of objects, it works the same way:

`function cmp($a, $b) { return $a->baz - $b->baz; } `

## Functions

You can do anything you need inside a comparison function, including calling functions:

`function cmp(array $a, array $b) { return someFunction($a['baz']) - someFunction($b['baz']); } `

## Strings

A shortcut for the first string comparison version:

`function cmp(array $a, array $b) { return strcmp($a['foo'], $b['foo']); } `

`strcmp`

does exactly what's expected of `cmp`

here, it returns `-1`

, `0`

or `1`

.

## Spaceship operator

PHP 7 introduced the spaceship operator, which unifies and simplifies equal/smaller/larger than comparisons across types:

`function cmp(array $a, array $b) { return $a['foo'] <=> $b['foo']; } `

## Sorting by multiple fields

If you want to sort primarily by `foo`

, but if `foo`

is equal for two elements sort by `baz`

:

`function cmp(array $a, array $b) { if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) { return $cmp; } else { return $a['baz'] - $b['baz']; } } `

For those familiar, this is equivalent to an SQL query with `ORDER BY foo, baz`

.

Also see this very neat shorthand version and how to create such a comparison function dynamically for an arbitrary number of keys.

## Sorting into a manual, static order

If you want to sort elements into a "manual order" like *"foo", "bar", "baz"*:

`function cmp(array $a, array $b) { static $order = array('foo', 'bar', 'baz'); return array_search($a['foo'], $order) - array_search($b['foo'], $order); } `

For all the above, if you're using PHP 5.3 or higher (and you really should), use anonymous functions for shorter code and to avoid having another global function floating around:

`usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; }); `

That's how simple sorting a complex multi-dimensional array can be. Again, just think in terms of *teaching PHP how to tell which of two items is "greater"*; let PHP do the actual sorting.

Also for all of the above, to switch between ascending and descending order simply swap the `$a`

and `$b`

arguments around. E.g.:

`return $a['baz'] - $b['baz']; // ascending return $b['baz'] - $a['baz']; // descending `

# Sorting one array based on another

And then there's the peculiar `array_multisort`

, which lets you sort one array based on another:

`$array1 = array( 4, 6, 1); $array2 = array('a', 'b', 'c'); `

The expected result here would be:

`$array2 = array('c', 'a', 'b'); // the sorted order of $array1 `

Use `array_multisort`

to get there:

`array_multisort($array1, $array2); `

_{If you have more common cases, feel free to edit this answer.}

# LINQ

In .NET, LINQ is frequently used for sorting, which provides a much nicer syntax over comparison functions, especially when objects need to be sorted by multiple fields. There're several ports of LINQ to PHP, including YaLinqo library*. With it, arrays can be sorted with a single line without writing complex comparison functions.

`$sortedByName = from($objects)->orderBy('$v->name'); $sortedByCount = from($objects)->orderBy('$v->count'); $sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name'); `

Comparisons can be further customized by passing a callback as a second argument, for example:

`$sortedByFilenameNat = from($objects)->orderBy('$v->filename', 'strnatcmp'); `

Here, `'$v->count'`

is a shorthand for `function ($v) { return $v->count; }`

(either can be used). These method chains return iterators, iterators can be transformed to arrays by adding `->toArray()`

in the end if needed.

Internally, `orderBy`

and related methods call appropriate array sorting functions (`uasort`

, `krsort`

, `multisort`

, `usort`

etc.).

LINQ contains many more methods inspired by SQL: filtering, grouping, joining, aggregating etc. It's best suited for cases when complex transformations on arrays and objects need to be performed without relying on databases.

_{* developed by me, see readme for more details and comparison with other LINQ ports}

The simplest is to use usort function to sort array without any looping : Below is an example :

` $array_compare= array("0" =>4,"1"=>2,"2"=>500,"3"=>100); `

This will sort in desending order :

`usort($array_compare, function($a, $b) { return ($b['x1'] - $a['x1']) > 0 ? 1 :-1; }); `

This will sort in asending order :

`usort($array_compare, function($a, $b) { return ($b['x1'] - $a['x1']) < 0 ? 1 :-1; }); `

It is very convenient to sort arrays with sorted function from Nspl:

Basic sortingSorting by function resultSorting multidimensional arraySorting array of objectsSorting with a comparison functionYou can see all these examples here.