Sort multidimensional array
Updated at: 09/10/2013
Questa funzione permette di ordinare un array multi-dimensionale secondo il nome di una colonna e specificando il verso
Esempio:
$arr = array_multiorderby($arr, "ordine asc");
/**
*
* @param array $data l'array da ordinare
* @param string $orderby nome della colonna e direzione (asc|desc)
* @param boolean $children_key specifica se ordinare anche i figli
* @return type
*/
function array_multiorderby($data, $orderby, $children_key = false) {
// parsing orderby
$args = array();
$x = explode(' ', str_replace(',', ' ', $orderby));
foreach ($x as $item) {
$item = trim($item);
if ($item == '')
continue;
if (strtolower($item) == 'asc')
$item = SORT_ASC;
else if (strtolower($item) == 'desc')
$item = SORT_DESC;
$args[] = $item;
}
// order
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
$data = array_pop($args);
// order children
if ($children_key) {
foreach ($data as $k => $v)
if (is_array($v[$children_key]))
$data[$k][$children_key] = array_multiorderby($v[$children_key], $orderby, $children_key);
}
// return
return $data;
}