Skip to content

Instantly share code, notes, and snippets.

@alright
Last active September 26, 2015 13:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alright/1107183 to your computer and use it in GitHub Desktop.
Save alright/1107183 to your computer and use it in GitHub Desktop.
Intuitive sorting of arrays in PHP
<?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