2010-10-22 7 views
0

J'essaie de créer un menu de navigation. Je reçois un tableau avec une structure comme celle-ci:Utilisation de la récursivité pour aplatir un tableau PHP avec des sous-postes basés sur des valeurs (gaspillé une heure sur ce!)

[ 
    [ 
    Title = A 
    Sub items = [ 
     Title = B 
     Sub items = [ 
     Title = C 
     ] 
    ] 
    ], 
    [ 
    Title = A 
    Sub items = [ 
     Title = B 
     Sub items = [ 
     Title = D 
     ] 
    ] 
    ], 
] 

que je dois prendre et la faire ressembler à ceci:

[ 
    Title = A 
    Sub items = [ 
    Title = B 
    Sub items = [ 
     Title = C, 
     Title = D 
    ] 
    ] 
] 

J'ai énuméré mon entrée et ma sortie désirée ci-dessous. Je m'arrache les cheveux sur celui-ci. J'essayais d'utiliser la récursivité, mais j'avais des problèmes avec des boucles infinies partout. Toute aide sur un bon moyen d'y remédier serait si appréciée.

Entrée:

Array 
(
    [0] => Array 
     (
      [title] => Dashboard 
      [path] => dashboard/ 
     ) 

    [1] => Array 
     (
      [title] => Settings 
      [path] => settings/ 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Instances 
          [path] => settings/instances/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Add an Instance 
              [path] => settings/instances/add-an-instance/ 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [title] => Modules 
          [path] => settings/modules/ 
         ) 

        [2] => Array 
         (
          [title] => Administrator 
          [path] => settings/administrator/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Change Password 
              [path] => settings/administrator/change-password/ 
             ) 

           ) 

         ) 

       ) 

     ) 

    [2] => Array 
     (
      [title] => Settings 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Routes 
          [path] => modules/routes/settings/routes/ 
         ) 

       ) 

     ) 

    [3] => Array 
     (
      [title] => Settings 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Cookies 
          [path] => modules/cookies/settings/cookies/ 
         ) 

       ) 

     ) 

    [4] => Array 
     (
      [title] => Settings 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Sessions 
          [path] => modules/sessions/settings/sessions/ 
         ) 

       ) 

     ) 

    [5] => Array 
     (
      [title] => Settings 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Databases 
          [path] => modules/databases/settings/databases/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Add a Database 
              [path] => modules/databases/settings/databases/add-a-database/ 
             ) 

           ) 

         ) 

       ) 

     ) 

    [6] => Array 
     (
      [title] => Settings 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Models 
          [path] => modules/models/settings/models/ 
         ) 

       ) 

     ) 

    [7] => Array 
     (
      [title] => Settings 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Users and Accounts 
          [path] => modules/users-and-accounts/settings/users-and-accounts/ 
         ) 

       ) 

     ) 

    [8] => Array 
     (
      [title] => Users and Accounts 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Users 
          [path] => modules/users-and-accounts/users/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Add a User 
              [path] => modules/users-and-accounts/users/add-a-user/ 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [title] => Accounts 
          [path] => modules/users-and-accounts/accounts/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Add an Account 
              [path] => modules/users-and-accounts/accounts/add-an-account/ 
             ) 

            [1] => Array 
             (
              [title] => Account Types 
              [path] => modules/users-and-accounts/accounts/account-types/ 
              [subItems] => Array 
               (
                [0] => Array 
                 (
                  [title] => Add an Account Type 
                  [path] => modules/users-and-accounts/accounts/account-types/add-an-account-type/ 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

Sortie:

Array 
(
    [0] => Array 
     (
      [title] => Dashboard 
      [path] => dashboard/ 
     ) 

    [1] => Array 
     (
      [title] => Settings 
      [path] => settings/ 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Instances 
          [path] => settings/instances/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Add an Instance 
              [path] => settings/instances/add-an-instance/ 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [title] => Modules 
          [path] => settings/modules/ 
         ) 

        [2] => Array 
         (
          [title] => Administrator 
          [path] => settings/administrator/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Change Password 
              [path] => settings/administrator/change-password/ 
             ) 

           ) 

         ) 

        [3] => Array 
        (
         [title] => Routes 
         [path] => modules/routes/settings/routes/ 
        ) 

        [4] => Array 
         (
          [title] => Cookies 
          [path] => modules/cookies/settings/cookies/ 
         ) 

        [5] => Array 
        (
         [title] => Sessions 
         [path] => modules/sessions/settings/sessions/ 
        ) 

        [6] => Array 
        (
         [title] => Databases 
         [path] => modules/databases/settings/databases/ 
         [subItems] => Array 
          (
           [0] => Array 
            (
             [title] => Add a Database 
             [path] => modules/databases/settings/databases/add-a-database/ 
            ) 

          ) 

         ) 

        [7] => Array 
        (
         [title] => Models 
         [path] => modules/models/settings/models/ 
        ) 

        [8] => Array 
        (
         [title] => Users and Accounts 
         [path] => modules/users-and-accounts/settings/users-and-accounts/ 
        ) 
       ) 
     ) 
    [2] => Array 
     (
      [title] => Users and Accounts 
      [subItems] => Array 
       (
        [0] => Array 
         (
          [title] => Users 
          [path] => modules/users-and-accounts/users/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Add a User 
              [path] => modules/users-and-accounts/users/add-a-user/ 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [title] => Accounts 
          [path] => modules/users-and-accounts/accounts/ 
          [subItems] => Array 
           (
            [0] => Array 
             (
              [title] => Add an Account 
              [path] => modules/users-and-accounts/accounts/add-an-account/ 
             ) 

            [1] => Array 
             (
              [title] => Account Types 
              [path] => modules/users-and-accounts/accounts/account-types/ 
              [subItems] => Array 
               (
                [0] => Array 
                 (
                  [title] => Add an Account Type 
                  [path] => modules/users-and-accounts/accounts/account-types/add-an-account-type/ 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 
) 
+1

Pouvez-vous être plus explicite? La différence entre les tableaux n'est pas si évidente pour moi. – mhitza

+0

Mis à jour ma question pour montrer plus de détails - merci pour les heads up –

+0

Mis à jour à nouveau pour être encore plus clair. =] –

Répondre

2
<?php 

function flattenArray($subitems) { 
    $titles = Array() ; 
    foreach($subitems as $subkey => $subvalue) { 
     if(!is_array($subvalue) 
      || !isset($subvalue['title']) 
      || !isset($subvalue['subItems']) 
      || !is_array($subvalue['subItems'])) { 

      //Leave this element as-is as it doesn't conform to expectations. 
      continue ; 
     } 
     if(isset($titles[$subvalue['title']])) { 
      foreach($subvalue['subItems'] as $subItem) { 
       $subitems[$titles[$subvalue['title']]]['subItems'][] = $subItem ; 
      } 
      unset($subitems[$subkey]) ; 
     } else { 
      $titles[$subvalue['title']] = $subkey ; 
     } 
    } 
    foreach($subitems as $subkey => $subvalue) { 
     if(is_array($subvalue) && isset($subvalue['subItems'])) { 
      $subitems[$subkey]['subItems'] = flattenArray($subvalue['subItems']) ; 
     } 
    } 
    return $subitems ; 
} 
?> 
+0

Merci beaucoup. Ce code fonctionne parfaitement. –