2010-05-28 8 views
5

Existe-t-il un moyen rapide d'aplatir un tableau et de sélectionner des sous-clés ('key' & 'valeur' ​​dans ce cas) sans exécuter une boucle foreach, ou le foreach est-il toujours le moyen le plus rapide?PHP: aplatir le tableau - le moyen le plus rapide?

Array 
(
    [0] => Array 
     (
      [key] => string 
      [value] => a simple string 
      [cas] => 0 
     ) 

    [1] => Array 
     (
      [key] => int 
      [value] => 99 
      [cas] => 0 
     ) 

    [2] => Array 
     (
      [key] => array 
      [value] => Array 
       (
        [0] => 11 
        [1] => 12 
       ) 

      [cas] => 0 
     ) 

) 

Pour:

Array 
(
    [int] => 99 
    [string] => a simple string 
    [array] => Array 
     (
      [0] => 11 
      [1] => 12 
     ) 
) 
+3

double: http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array Je pense que cette réponse vous aidera le plus : http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array/1320156#1320156 –

+0

Une raison de le rendre "le plus rapide"? –

+0

Une raison pour laquelle vous n'avez pas voulu utiliser 'foreach'? – salathe

Répondre

3

Donnez ce un coup:

$ret = array(); 
while ($el = each($array)) { 
    $ret[$el['value']['key']] = $el['value']['value']; 
} 
+1

oh quels anciens opérateurs :) –

+0

Je recommanderais toujours d'initialiser l'itérateur du tableau en utilisant 'reset ($ array)' juste avant d'itéter de cette façon, pour éviter qu'un autre appel, par ex. 'end()' l'aurait gâché. Beaucoup de façons de tomber dans le piège ... –

+0

Essayez cette solution: http://stackoverflow.com/a/1320259/1847769 – t1gor

3

call_user_func_array("array_merge", $subarrays) peut être utilisé pour "aplatir" tableaux imbriqués.
Ce que vous voulez, c'est quelque chose de complètement différent. Vous pouvez utiliser array_walk() avec un rappel à la place pour extraire les données dans le format souhaité. Mais non, la boucle foreach est encore plus rapide. Il n'y a pas de méthode array_* pour réaliser votre structure autrement.

+0

array_walk ne fonctionnerait pas en elle-même, parce qu'il ne retourne rien, sauf un bool (et vous ne pouvez pas modifier la clé du tableau). – ircmaxell

-1

Ceci devrait combiner correctement les tableaux avec des clés entières. Si les clés sont contiguës et commencent à zéro, elles seront supprimées. Si une clé entière n'existe pas encore dans le tableau plat, elle sera conservée telle quelle; cela devrait surtout préserver les tableaux non contigus.

function array_flatten(/* ... */) 
{ 
    $flat = array(); 
    array_walk_recursive(func_get_args(), function($value, $key) 
    { 
     if (array_key_exists($key, $flat)) 
     { 
      if (is_int($key)) 
      { 
       $flat[] = $value; 
      } 
     } 
     else 
     { 
      $flat[$key] = $value; 
     } 
    }); 
    return $flat; 
} 

Vous pouvez utiliser !isset($key) ou empty($key) au lieu de favoriser des valeurs utiles.

Voici une version plus concise:

function array_flatten(/* ... */) 
{ 
    $flat = array(); 
    array_walk_recursive(func_get_args(), function($value, $key) use (&$flat) 
    { 
     $flat = array_merge($flat, array($key => $value)); 
    }); 
    return $flat; 
} 
Questions connexes