2011-10-02 6 views
0

J'essaie de réaliser quelque chose que je croyais naïvement simple: aplatir un tableau multidimensionnel (qui pourrait avoir plusieurs niveaux imbriqués) tout en conservant des tableaux. Idéalement, je cherche une fonction qui peut parcourir 10+ niveaux imbriqués et gérer différents ensembles de clés (pas forcément toujours les mêmes).Transformez un tableau PHP multidimensionnel en un tableau bidimensionnel

En bref, tourner ceci:

Array 
    (
     [0] => Array 
      (
       [0] => Array 
        (
         [index] => -1 
         [qty] => 77 
         [id] => 7 
        ) 

       [1] => Array 
        (
         [index] => -1 
         [qty] => 83 
         [id] => 8 
        ) 
      ) 

     [1] => Array 
      (
       [0] => Array 
        (
         [index] => -1 
         [qty] => 75 
         [id] => 13 
        ) 

       [1] => Array 
        (
         [index] => -1 
         [qty] => 60 
         [id] => 14 
         [msr] => g 
        ) 
      ) 

     [2] => Array 
      (
       [index] => -1 
       [qty] => 10 
       [id] => 12 
      ) 
    ) 

Dans ceci:

Array 
    (
     [0] => Array 
      (
       [index] => -1 
       [qty] => 77 
       [id] => 7 
      ) 

     [1] => Array 
      (
       [index] => -1 
       [qty] => 83 
       [id] => 8 
      ) 

     [2] => Array 
      (
       [index] => -1 
       [qty] => 75 
       [id] => 13 
      ) 

     [3] => Array 
      (
       [index] => -1 
       [qty] => 60 
       [id] => 14 
       [msr] => g 
      ) 

     [4] => Array 
      (
       [index] => -1 
       [qty] => 10 
       [id] => 12 
      ) 
    ) 

C'est ce que j'avais et de la pensée travaillerais, mais je me retrouve avec un tableau plat avec aucune information clé (et si je veux des clés, chaque itération écrase les valeurs précédentes et je me retrouve avec juste le dernier tableau de toutes):

function flatten_multi_array(array $array){ 
    $ret_array = array(); 
    foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $value) { 
     $ret_array[] = $value; 
    } 
    return $ret_array; 
} 

Répondre

1
function dig($source, &$out){ 
    foreach ($source as $k => $v){ 
     if (isset($v["index"]){ 
      $out[] = $v; 
     } else { 
      dig($v, $out); 
     } 
    } 
} 

et c'est tout.

utilisation

:

$out = array(); 
$source = array(); // your magic nested array 

dig($source, $out); 

et maintenant $out a ce que vous avez besoin.

+0

Merci pour la réponse. Mais cela n'a pas vraiment marché. Je reçois un tableau aplati et perd toutes les informations clés ... –

+0

bien sûr, il ne fusionne pas les sous-systèmes, pas la maintenance de la clé. si vous avez besoin d'une clé, remplacez simplement $ out = $ v par $ out = array (..., "key" => $ k); d'après la description, il n'était pas clair si l'une ou l'autre des clés est unique ou devrait être maintenue. – jancha

+0

J'avais déjà une fonction qui faisait la même chose (voir edit), et si je veux avoir des clés, puisqu'elle n'a pas de seconde dimension, toutes les valeurs seraient écrasées. –

0

Quelque chose comme ce code non testé peut-être ...

$outArray = array(); 
foreach($originalArray as $nestedArray){ 
    foreach($nestedArray as $innerArray){ 
     $outArray[] = $innerArray; 
    } 
} 
print_r($outArray); 
+0

Doit être récursif ... – prodigitalson

+0

J'ai raté cette partie ... grattez ça alors –

0

Je vois que cela a été vient de répondre. Eh bien, je pensais apporter ma solution depuis que je l'ai fait. : P

$newArray = array(); 
function isMulti($k,$v){ 
    global $newArray; 
    if(is_array($v)){ 
    foreach($v as $k2 => $v2){ 
     if(!is_array($v2)){ 
      $newArray[] = $v; 
      break; 
     }else{ 
      isMulti($k2,$v2); 
     } 
    } 
    } 
} 
foreach($arrayInQuestion as $k => $v){ 
    isMulti($k,$v); 
} 
+0

Eh bien, au moins la mienne fonctionne sans avoir les touches 'index'. : P – bozdoz

0

Si vous cherchez toujours l'approche RecursiveIteratorIterator, consultez les rubriques suivantes:

foreach(new RecursiveIteratorIterator(new ParentIterator(new RecursiveArrayIterator($array)), RecursiveIteratorIterator::SELF_FIRST) as $value) { 
    if (isset($value['index'])) 
     $ret_array[] = $value; 
} 

Cela devrait le faire dans votre fonction. Voir aussi le demo.

connexes: Quick Recursive search of all indexes within an array

+0

Merci! J'aime vraiment cette approche alternative! –

Questions connexes