2012-08-16 2 views
0

Possible en double:
PHP Walk through multidimensional array while preserving keysPHP convertir tableau profond

J'ai un tableau profond comme celui-ci:

array { 
    ["key1"] => "A" 
    ["key2"] => "B" 
    ["key3"] => array { 
       ["subkey1"] => "C" 
       ["subkey2"] => array { 
            ["subsubkey1"] => "D" 
           } 
       } 

} 

Je ne sais pas comment ce tableau profond aura. Maintenant, je veux le convertir en un tableau qui ressemble à ceci:

array { 
    array { 
    ["key1"] => "A" 
    ["key2"] => "B" 
    ["key3.subkey1"] => "C" 
    ["key3.subkey2.subsubkey1"] = > "D" 
} 

Comment puis-je faire cela? Je suppose qu'il a besoin d'une récursivité?

+4

Oui, récursivité serait * une * bonne façon de le gérer. Qu'avez-vous essayé et où êtes-vous exactement coincé? – deceze

+0

S'il vous plaît utiliser la recherche, cela a été demandé et répondu avant. Vous pouvez le faire avec récursivité ou avec une pile. – hakre

+0

@hakra: la réponse sélectionnée est terriblement illisible: -S Et on dirait que ça ne marche pas comme prévu – zerkms

Répondre

2

Aussi simple que

$array = array(
    'a' => array(
     'b' => array(
      'c' => 'val' 
     ), 
     'd' => 'val2' 
    ), 
    'e' => 'val3' 
); 

var_dump(collapse($array)); 

function collapse($array) 
{ 
    $result = array(); 
    foreach ($array as $key => $val) { 
     if (is_array($val)) { 
      foreach (collapse($val) as $nested_key => $nested_val) { 
       $result[$key . '.' . $nested_key] = $nested_val; 
      } 
     } else { 
      $result[$key] = $val; 
     } 
    } 

    return $result; 
} 

http://ideone.com/ieSZ6

PS: en général, je n'aime pas donner des solutions complètes, mais dans ce cas - la solution pourrait être trop difficile pour les débutants

2

Comme écrit cela peut être fait avec récursivité ou en utilisant une pile. Ceci est un exemple d'utilisation d'une pile:

$separator = '.'; 
$flat = array(); 

while ($array) 
{ 
    list($key, $value) = array(key($array), array_shift($array)); 
    if (is_array($value)) 
    { 
     foreach($value as $subKey => $node) 
      $array[$key.$separator.$subKey] = $node; 
     continue; 
    } 
    $flat[$key] = $value; 
} 

Le résultat est alors en $flat, avec vos $array données comme ceci:

Array 
(
    [key1] => A 
    [key2] => B 
    [key3.subkey1] => C 
    [key3.subkey2.subsubkey1] => D 
)