2009-10-27 5 views
0

J'ai un tableau du tri complexe pour stocker ma navigation (qui est supposée être modifiée par l'utilisateur par la suite). Je ne veux pas que le script fonctionne seulement avec 3 niveaux de profondeur, donc je cherche un bon et bon moyen de trier ce tableau par le champ de position.PHP: Trier un tableau multidimensionnel avec une profondeur différente par élément par champ

$nav[1]=array( 
    'name'=>'home', 
    'position'=>'2', 
children=>array(

    [1]=array(
    'name'=>'page2', 
    position=>'3'), 

    [2]=array(
    'name'=>'page3', 
    'position'=>'1'), 

    [3]=array(
    'name'=>'page4', 
    'position'=>'2') 
) 
$nav[2]=array(
    'name'=>'Second level 1', 
    'position'=>'1' 
); 

J'espère que quelqu'un peut m'aider, merci d'avoir pensé au problème.

Répondre

3

Trier chaque tableau children de manière récursive. Par exemple:

function cmp($a, $b) 
{ 
    $ap = intval($a['position']); 
    $bp = intval($b['position']); 
    if ($ap == $bp) { 
     return 0; 
    } 
    return ($ap < $bp) ? -1 : 1; 
} 

function sort_menu(&$item) 
{ 
    if ($item['children']) { 
     foreach ($item['children'] as &$child) { 
      sort_menu($child); 
     } 
     usort($item['children'], "cmp"); 
    } 
} 

$tmp = array('children' => $nav); 
sort_menu($tmp); 
$nav = $tmp['children']; 
+0

La fonction usort de PHP vous sera utile: http://de.php.net/manual/fr/function.usort.php – Max

0

Voici un exemple d'utilisation. Vous pouvez l'appeler dans votre tableau $ nav en récursion dans une autre fonction. Vous pouvez l'appeler dans votre tableau $ nav.

+0

Hé, mon problème est, que je ne reçois pas la récursivité de travailler avec un inconnu, potentiellement infini nombre de niveaux (enfant de l'enfant de l'enfant de ...) –

+0

Lukáš Lalinský posté bonne solution pour votre problème –

+0

okey, je vais essayer à nouveau et regarder de plus près. Merci. –

Questions connexes