PHP Sorting Functions

In all the countless hours I’ve spent with php, I’ve maybe used three or four of these sorting functions. I really had no idea that there is a total of eleven functions used for sorting arrays. Anyway, I’m betting that it may be useful to have these memorized before I take the Zend PHP Certification Exam so here is a brief overview of each one.

A lot of the sorting functions have an optional flag that may be used to modify the sorting behavior.
The available flags are:

SORT_REGULAR – compare items normally (don’t change types)
SORT_NUMERIC – compare items numerically
SORT_STRING – compare items as strings
SORT_LOCALE_STRING – compare items as strings, based on the current locale.

All of these functions sort arrays. I don’re really think it’s necessary to type out an example for each one but I will go into greater detail about some. Each function will return a boolean which is true on success and false on failure.

  1.  
  2. bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

This sort function will arrange the elements from lowest to highest.
Array indices do NOT maintain their correlation with the array elements they are associated with.

  1.  
  2. bool rsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

This one will arrange the elements from highest to lowest (Reverse Sort).

  1.  
  2. bool natsort ( array &$array )
  3.  

This sorting function will sort the array alphanumerically. This is more “natural” for most people.
Here is a comparison between the regular sort and this natural sort from the
php.net site
:

  1.  
  2. <?php
  3. $array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");
  4.  
  5. asort($array1);
  6. echo "Standard sorting\n";
  7. print_r($array1);
  8.  
  9. natsort($array2);
  10. echo "\nNatural order sorting\n";
  11. print_r($array2);
  12. ?>
  13. Which will output:
  14. Standard sorting
  15. (
  16.     [3] => img1.png
  17.     [1] => img10.png
  18.     [0] => img12.png
  19.     [2] => img2.png
  20. )
  21.  
  22. Natural order sorting
  23. (
  24.     [3] => img1.png
  25.     [2] => img2.png
  26.     [1] => img10.png
  27.     [0] => img12.png
  28. )
  29.  
  1.  
  2. bool natcasesort ( array &$array )
  3.  

A case insensitive version of natsort.

  1.  
  2. bool ksort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

Sorts an array by the key. It also maintains the key to data correlations.

  1.  
  2. bool krsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

Sorts by key, but in reverse.

  1.  
  2. bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

This is very similar to the regular sort outlined above except the array indices maintain
their correlation with the array elements they are associated with.

  1.  
  2. bool arsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
  3.  

Similar to the asort but reversed.

  1.  
  2. bool usort ( array &$array , callback $cmp_function )
  3.  

This function allows for a custom comparsion function to create different sorting methods. This function should accept only two parameters and return an integer less than, equal to,
or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. Here’s an example:

  1.  
  2. <?php
  3. function cmp($a, $b)
  4. {
  5.     if ($a == $b) {
  6.         return 0;
  7.     }
  8.     return ($a < $b) ? -1 : 1;
  9. }
  10.  
  11. $a = array(3, 2, 5, 6, 1);
  12.  
  13. usort($a, "cmp");
  14.  
  15. foreach ($a as $key => $value) {
  16.     echo "$key: $value\n";
  17. }
  18. ?>
  19.  
  20.  
  1.  
  2. bool uasort ( array &$array , callback $cmp_function )
  3.  

This is similar to usort except the array indices maintain their
correlation with the array elements they are associated with.

  1.  
  2. bool uksort ( array &$array , callback $cmp_function )
  3.  

This last sort function works similar to the previous two where you can define a custom comparison function. The difference is that this one works on the keys and it also maintains the correlation with the elements.

There is also a nice comparison of all these functions at php.net