2010-11-02 6 views
0

J'ai plusieurs chaînes similaires à:Comment diviser plusieurs chaînes dans un tableau imbriqué en profondeur?

$str = "/One/Two"; 
$str2 = "/One/Two/Flowers"; 
$str3 = "/One/Two/Grass"; 
$str4 = "/One/Another/Deeper"; 
$str5 = "/Uno/Dos/Cow"; 

Je veux diviser en un tableau imbriqué profond qui ressemble à ce qui suit:

Array 
(
    [One] => Array 
    (
     [Two] => Array 
     (
      [Flowers] => 
      [Grass] => 
     )  
     [Another] => Array 
     (
      [Deeper] => 
     )   
    ) 
    [Uno] => Array 
    (
     [Dos] => Array 
     (
      [Cow] => 
     )    
    )   
) 

Répondre

5

Cela devrait le faire:

$strings = array(
    "/One/Two", 
    "/One/Two/Flowers", 
    "/One/Two/Grass", 
    "/One/Another/Deeper", 
    "/Uno/Dos/Cow" 

); 

$result = array(); 

foreach($strings as $string) { 
    $parts = array_filter(explode('/', $string)); 

    $ref = &$result; 
    foreach($parts as $p) { 
     if(!isset($ref[$p])) { 
      $ref[$p] = array(); 
     } 
     $ref = &$ref[$p]; 
    } 
    $ref = null; 
} 

print_r($result); 

Exemple de travail:

http://codepad.org/GmAoXLXp

+0

Tatu Ulmanen, vous êtes mon héros! Je ne peux pas accepter la réponse pendant 4 minutes, mais vous avez fait exactement ce dont j'avais besoin. – Ahungry

+0

Je pense qu'une partie du code dans cette solution est un peu redondant mais surtout je suis juste amer au manque de reconnaissance pour une réponse tardive de quelques secondes = \ – erisco

+0

@erisco, si par redondant vous faites référence à la partie 'isset', en fait est nécessaire, en référençant une variable non initialisée jettera un avis. Et mettre '$ ref' à' null' à la fin empêche les références d'apparaître dans le tableau final. A part ça, nos codes semblent être assez identiques. +1 pour ça :) –

1

Quelque chose comme ça devrait fonctionner. Je n'arrivais pas à trouver une façon fonctionnelle de construire la structure, alors je suis tombé sur quelques boucles foreach.

<?php 

$strings = array(
    '/One/Two', 
    '/One/Two/Flowers', 
    '/One/Two/Grass', 
    '/One/Another/Deeper', 
    '/Uno/Dos/Cow' 
); 

$paths = array_map(
    function ($e) { 
     return explode('/', trim($e, '/')); 
    }, 
    $strings 
); 

$pathStructure = array(); 

foreach ($paths as $path) { 
    $ref =& $pathStructure; 
    foreach ($path as $dir) { 
     $ref =& $ref[$dir]; 
    } 
} 
unset($ref); 

print_r($pathStructure); 
+0

Merci d'avoir pris le temps avec cette question erisco, j'ai déjà mis ma coche sur celle de Tatu, mais votre méthode fonctionne aussi bien. Je vais étudier les deux et comprendre comment cela a été fait. – Ahungry

+0

Aw, merci Ahungry. Tu as fait ma matinée tant mieux. – erisco

Questions connexes