Como classificar todos os níveis de multidimensional array por chave?

Encontrei este código para classificar:

usort($array, function($a, $b) { return $a['order_inside_level'] - $b['order_inside_level']; }); 

É bom para um nível. Eu tenho algo assim:

 array( array( 'level'=>'aaa', 'order'='1', 'subs'=>array( array( 'level'=>'bbb', 'order'='1', 'subs'=>array( array( 'level'=>'ccc', 'order'='1', 'subs'=>array( array( 'level'=>'ddd', 'order'='1', 'subs'=>array( ... ) ) ) ) , array( 'level'=>'ccc', 'order'='2', 'subs'=>array( ) ) ), array( 'level'=>'bbb', 'order'='2' ), array( 'level'=>'bbb', 'order'='3' ) ) ) ), array( 'level'=>'aaa', 'order'='2', 'subs'=>array( ) ) ) 

A matriz pode ter qualquer profundidade e qualquer número de elementos em cada nível. Eu preciso classificar cada nível de profundidade (aaa, bbb, ccc, etc.) usando o código acima por chave ‘ordem’.

Você precisará fazer isso de forma recursiva .

 recursive_sort($arr, $func) { foreach ($arr as $key => $val) { if (is_array($val)) { recursive_sort($val, $func); } } usort($arr, $func); } 

Este código irá iterar sobre a matriz dada, e para cada valor que é uma matriz, chamar-se com o valor. O resultado é que usort será chamado para cada matriz dentro da estrutura.

Você chamaria a function do mesmo que usort :

 recursive_sort($array, function($a, $b) { return $a['order_inside_level'] - $b['order_inside_level']; }); 
 function recursive_sort(&$arr) { fs($arr); foreach($arr as $k=> &$v){ if (isset($v['subs'])) { recursive_sort($v['subs']); } } } function sortByOrder($a, $b) { return $a['order_inside_level'] - $b['order_inside_level']; } function fs(&$array){ usort($array, 'sortByOrder'); } 

Depois de múltiplas tentativas eu tenho isso. Funciona. O nome da chave (subs) é codificado, o que não é tão bom, mas … Estou feliz por isso funcionar.