2010-04-23 10 views
2

Dire que j'ai une forme avec ces champs, et ne peut pas les renommer:Aplatir un tableau PHP

<input type="text" name="foo[bar]" /> 
<input type="text" name="foo[baz]" /> 
<input type="text" name="foo[bat][faz]" /> 

Lorsque soumis, PHP transforme ceci en un tableau:

Array 
(
    [foo] => Array 
     (
      [bar] => foo bar 
      [baz] => foo baz 
      [bat] => Array 
       (
        [faz] => foo bat faz 
       ) 

     ) 

) 

Quelles méthodes sont là pour convertir ou aplatir ce tableau dans une structure de données telles que:

Array 
(
    [foo[bar]] => foo bar 
    [foo[baz]] => foo baz 
    [foo[bat][faz]] => foo bat faz 
) 
+1

Allez c'est pas si difficile à chercher! Voici quelques résultats de Bing: http://www.bing.com/search?q=php%2Barray%2Bflatten Et voici un de débordement de pile: http://stackoverflow.com/questions/1319903/how-to- flatten-a-multidimensional-array – encee

+1

Un tableau plat standard n'est pas ce qui est demandé. Toutes les clés dans chaque chemin d'accès à chaque nœud feuille est la question, puis créer une chaîne à partir des clés dans chaque chemin. – goat

Répondre

4

Je pense que c'est ce que vous voulez

$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)); 
$result = array(); 
foreach ($ritit as $leafValue) { 
    $path = 'foo99'; 
    foreach (range(0, $ritit->getDepth()) as $depth) { 
     $path .= sprintf('[%s]', $ritit->getSubIterator($depth)->key()); 
    } 
    $result[$path] = $leafValue; 
} 

Par défaut, RecursiveIteratorIterator ne visite que nœuds feuilles, de sorte que chaque itération de la boucle foreach externe a la structure iterator arrêté sur l'une des valeurs que vous aimez. Nous trouvons les clés qui construisent notre chemin vers où nous en sommes en jetant un coup d'œil aux itérateurs que RecursiveIteratorIterator crée et gère pour nous (un itérateur est utilisé pour chaque niveau).

+0

Génial, merci chris! Je devrais vraiment en apprendre plus sur le SPL – deadkarma

0

Peut être réponse stupide, mais pourquoi ne pas faire

<input type="text" name="foobar" /> 
<input type="text" name="foobaz" /> 
<input type="text" name="foobatfaz" /> 

?

+1

Première phrase de la question: "Dites que j'ai une forme avec ces champs, et ne peut pas les renommer ..." –

-2

Pas la réponse à votre question mais alternativement il y a extract qui prendra un tableau et en produira des variables. par exemple;

$array = array 
    (
     [foo] => foo bar 
     [boo] => something else 
    ) 
extract($array); 

Sortie

$foo = 'foo bar'; 
$boo = 'something else'; 

Il y a quelques options sur la façon de traiter de façon identique les noms d'index, par exemple, sur écrire la valeur existante ou ajouter un préfixe au nom de la variable.

+4

en utilisant 'extract' avec l'entrée de l'utilisateur est toujours mauvaise idée –

+0

un point très valide. n'avait pas considéré cela. – bigstylee