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