2010-11-19 5 views
0

Je voudrais prendre un tableau, disent:

array("one", "two", "three"); 

et d'en faire un tableau de tableaux, comme:

$someArray["one"]["two"]["three"]; 

Le tableau de tableaux ($someArray) devrait être créé par une sorte de boucle que le tableau initial est créé par un explode() donc je ne sais pas à quelle profondeur $someArray serait. J'espère que c'est clair, merci à tous pour votre temps!

Je suis en train de lire à ce sujet pour le moment moi-même, serait array_map() travailler pour cela?

Répondre

1

Vous devez utiliser array_reduce. La solution est assez simple.

Pour ce faire, inversez la matrice et appliquez ensuite la réduction.

$a = array('a','b','c'); 
$x = array_reduce(array_reverse($a), function ($r, $c) { 
     return array($c=>$r); 
    },array()); 

EDIT une version élargie et a expliqué:

en php nous n'avons pas une fonction d'aller en profondeur dans un tableau automatiquement mais nous avons pas. Si vous commencez à partir du bas, nous pourrons placer un tableau dans le précédent avec une simple affectation. Par ailleurs, je préfère la forme la plus courte. Je pense que c'est un idiome fonctionnel et n'a pas besoin de plus d'explications à un développeur d'expérience moyenne (avec un peu de fond fonctionnel). Le deuxième ajouter beaucoup de bruit, il est approprié d'apprendre, mais source de distraction dans le code de production (évidemment, je fais référence à la fonction avec juste une déclaration de retour).

+0

bon compagnon pourrait vous réécrivez que, pour ne être si courte main et ce qui est $ r, c $ devraient-ils par k $, $ v ? vous avez confondu au début moi et j'ai utilisé php pendant 13 ans juste pour les utilisateurs qui ne sont pas si avancés – Barkermn01

+0

@ Barkermn01 vous savez, $ r représentent le résultat, $ c représentent le courant. Je suis habitué à ce nom pour les paramètres de la fonction array_reduce. Je vais développer un peu leurs noms (et essayer d'ajouter une explication aussi) – Eineki

4

Vous pouvez le faire:

$path = array("one", "two", "three"); 
$ref = &$arr; 
foreach ($path as $key) { 
    if (!isset($ref[$key])) break; 
    $ref = &$ref[$key]; 
} 

A la fin $ref est une référence à $arr['one']['two']['three'] si elle existe. Et si vous remplacez break par $ref[$key] = array(), vous allez créer un tableau avec cette structure à la place.

+0

lol même chose que moi juste un peu plus court haha ​​ – Barkermn01

0

Je ne sais pas pourquoi vous voudriez cela.

Mais, mais la base de ce que votre désir serait comme ça

$numbers = array("one", "two", "three"); 

$array = array(); 
$pointer = &$array; 

$last_val = NULL; 

foreach($numbers as $key => $val){ 
    if(!empty($pointer[$last_val])){ 
     $pointer = &$pointer[$last_val]; 
     $pointer = new array($val); 
     $last_val = $val; 
    }else{ 
     $pointer = new array($val); 
     $last_val = $val; 
    } 
} 

Cela devrait alors droit ce que vous voulez $ array;

Ceci est non testé, mais je pense que cela devrait fonctionner si elle ne se contente pas me dire ce que le faire et je vais jeter un oeil

0
$arrNew = array(); 
$ref = &$arrNew; 
$arrParts = array("one", "two", "three"); 

foreach($arrParts as $arrPart){ 

    $ref[$arrPart] = array(); 
    $ref = &$ref[$arrPart]; 
} 

Lorsque vous imprimez $ arrNew, il va imprimer ce ..

Array 
(
    [one] => Array 
     (
      [two] => Array 
      (
       [three] => Array 
        (
        ) 

      ) 

    ) 

)

Questions connexes