Last active
September 26, 2015 13:57
-
-
Save alright/1107183 to your computer and use it in GitHub Desktop.
Intuitive sorting of arrays in PHP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Predefined constants | |
define('DO_SORT_BY_VALUE', 1); | |
define('DO_SORT_BY_KEY', 2); | |
define('DO_SORT_ASC', 1); | |
define('DO_SORT_DESC', 2); | |
define('DO_SORT_NATURAL', 3); | |
define('DO_SORT_NATURAL_CASE', 4); | |
define('DO_SORT_RANDOM', 5); | |
define('DO_SORT_USER', 6); | |
function do_sort (array & $array) | |
{ | |
// Arguments | |
$args = func_get_args(); | |
$sort_by = $args[1]; | |
$order = $args[2]; | |
$preserve_keys = $args[3]; | |
$flags = $args[4]; | |
// Some predefined behaviours | |
switch ($order) | |
{ | |
case DO_SORT_USER: | |
// If user's sorting | |
$function = $args[4]; | |
break; | |
case DO_SORT_NATURAL: | |
case DO_SORT_NATURAL_CASE: | |
// Natural sortings are when keys are preserved | |
$preserve_keys = TRUE; | |
break; | |
case DO_SORT_RANDOM: | |
// Random is when keys are not preserved | |
$preserve_keys = FALSE; | |
break; | |
} | |
// Sorting | |
switch ($sort_by) | |
{ | |
case DO_SORT_BY_VALUE: | |
if ( ! empty($preserve_keys)) | |
{ | |
switch ($order) | |
{ | |
case DO_SORT_ASC: | |
return asort($array, $flags); | |
case DO_SORT_DESC: | |
return arsort($array, $flags); | |
case DO_SORT_NATURAL: | |
return natsort($array); | |
case DO_SORT_NATURAL_CASE: | |
return natcasesort($array); | |
case DO_SORT_USER: | |
return uasort($array, $function); | |
default: | |
throw new Exception('Sorting order is wrong'); | |
} | |
} | |
else | |
{ | |
switch ($order) | |
{ | |
case DO_SORT_ASC: | |
return sort($array, $flags); | |
case DO_SORT_DESC: | |
return rsort($array, $flags); | |
case DO_SORT_RANDOM: | |
return shuffle($array); | |
case DO_SORT_USER: | |
return usort($array, $function); | |
default: | |
throw new Exception('Sorting order is wrong'); | |
} | |
} | |
case DO_SORT_BY_KEY: | |
switch ($order) | |
{ | |
case DO_SORT_ASC: | |
return ksort($array, $flags); | |
case DO_SORT_DESC: | |
return krsort($array, $flags); | |
case DO_SORT_USER: | |
return uksort($array, $function); | |
default: | |
throw new Exception('Sorting order is wrong'); | |
} | |
default: | |
throw new Exception('Sorting setting is wrong'); | |
} | |
} | |
/** | |
* Some usage examples | |
*/ | |
$array = array(3, 5, 1, 9, 2, 0, 4, 5, 8, 6, 7); | |
do_sort($array, DO_SORT_BY_VALUE, DO_SORT_ASC); | |
print 'Low to high by value: '.implode(',', $array).'<br>'; | |
do_sort($array, DO_SORT_BY_VALUE, DO_SORT_DESC); | |
print 'High to low by value: '.implode(',', $array).'<br>'; | |
do_sort($array, DO_SORT_BY_VALUE, DO_SORT_RANDOM); | |
print 'Random by value: '.implode(',', $array).'<br>'; | |
// Our array is changed by random sort, so we set it again | |
$array = array(3, 5, 1, 9, 2, 0, 4, 5, 8, 6, 7); | |
do_sort($array, DO_SORT_BY_KEY, DO_SORT_ASC); | |
print 'Low to high by key: '.implode(',', $array).'<br>'; | |
do_sort($array, DO_SORT_BY_KEY, DO_SORT_DESC); | |
print 'High to low by key: '.implode(',', $array).'<br>'; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment