91 votes

Comment "aplatir" un tableau multidimensionnel en un tableau simple en PHP ?

C'est probablement une question de débutant, mais je consulte la documentation depuis un certain temps déjà et je ne trouve aucune solution. Je pensais que je pouvais utiliser implode pour chaque dimension et ensuite remettre ces chaînes ensemble avec str_split pour créer un nouveau tableau simple. Cependant, je ne sais jamais si le modèle de jointure n'est pas aussi dans les valeurs et donc après avoir fait str_split mes valeurs originales pourraient se briser.

Y a-t-il quelque chose comme combine($array1, $array2) pour les tableaux à l'intérieur d'un tableau multidimensionnel ?

0 votes

Veuillez vérifier ce lien pour la solution : stackoverflow.com/questions/14951811/

2 votes

Une autre bonne question de référence avec peut-être de meilleures réponses : Comment aplatir un tableau multidimensionnel ?

146voto

Prasanth Bendra Points 9618
$array  = your array

$result = call_user_func_array('array_merge', $array);

echo "<pre>";
print_r($result);

REF : http://php.net/manual/en/function.call-user-func-array.php

Voici une autre solution (fonctionne avec un tableau multidimensionnel) :

function array_flatten($array) {

   $return = array();
   foreach ($array as $key => $value) {
       if (is_array($value)){ $return = array_merge($return, array_flatten($value));}
       else {$return[$key] = $value;}
   }
   return $return;

}

$array  = Your array

$result = array_flatten($array);

echo "<pre>";
print_r($result);

0 votes

Cette réponse est beaucoup plus rapide que la réponse acceptée.

15 votes

Depuis php5.3, vous pouvez utiliser l'opérateur splat : $result = array_merge(...$array); php.net/manual/en/

1 votes

Votre première réponse ne fonctionne pas avec un tableau multidimensionnel. 3v4l.org/tY8vD

43voto

Luc M Points 4950

Utilisez array_walk_recursive

<?php

$aNonFlat = array(
    1,
    2,
    array(
        3,
        4,
        5,
        array(
            6,
            7
        ),
        8,
        9,
    ),
    10,
    11
);

$objTmp = (object) array('aFlat' => array());

array_walk_recursive($aNonFlat, create_function('&$v, $k, &$t', '$t->aFlat[] = $v;'), $objTmp);

var_dump($objTmp->aFlat);

/*
array(11) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
  [10]=>
  int(11)
}
*/

?>

Testé avec PHP 5.5.9-1ubuntu4.24 (cli) (construit : Mar 16 2018 12:32:06)

0 votes

Quelqu'un sait-il pourquoi cela ne fonctionne pas si je n'utilise pas la fonction (dépréciée) de passage par référence au moment de l'appel ? c'est-à-dire array_walk_recursive($array, create_function('&$v, $k, &$t', '$t[] = $v;'), &$flattened) ; La définition de la fonction est correctement définie comme passant par référence. mais ne fonctionne pas si je ne passe pas par référence au moment de l'appel.

2 votes

@jskilski Objects ( $objTmp dans cet exemple) sont automatiquement transmises par référence, mais pas les tableaux. Essayez d'utiliser une fonction anonyme ( php.net/manual/fen/functions.anonymous.php ) au lieu de create_function .

1 votes

Cela ne fonctionne pas en php 5.3.3 à cause d'un bogue dans array_walk_recursive -. bugs.php.net/bug.php?id=52719

18voto

upallnite Points 101
// $array = your multidimensional array

$flat_array = array();

foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v){

$flat_array[$k] = $v;

}

Également documenté : http://www.phpro.org/examples/Flatten-Array.html

2 votes

Remarque : à utiliser uniquement pour les tableaux de primitives. "RecursiveArrayIterator traite tous les objets comme ayant des enfants, et essaie de récursionner en eux". php.net/manual/fr/class.recursivearrayiterator.php#106519

0 votes

@hakre : +1 d'accord : ajout iterator_to_array() à cette réponse annulerait la nécessité de la foreach boucle. Il pourrait s'agir d'une simple fonction d'une ligne. (bien qu'elle soit un peu longue)

3 votes

Je sais que c'est vieux mais toujours utile, cependant le $k doit être remplacé par quelque chose d'unique, comme un compteur. La simple utilisation de $k entraîne la suppression d'éléments si les noms sont les mêmes dans les tableaux internes que dans le tableau principal.

5voto

chaos Points 69029
function flatten_array($array, $preserve_keys = 0, &$out = array()) {
    # Flatten a multidimensional array to one dimension, optionally preserving keys.
    #
    # $array - the array to flatten
    # $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys
    # $out - internal use argument for recursion
    foreach($array as $key => $child)
        if(is_array($child))
            $out = flatten_array($child, $preserve_keys, $out);
        elseif($preserve_keys + is_string($key) > 1)
            $out[$key] = $child;
        else
            $out[] = $child;
    return $out;
}

0 votes

Désolé, mais il ne semble pas gérer correctement les tableaux multidimensionnels. Démo

5voto

SamGoody Points 4406

Une autre méthode de PHP commentaires des utilisateurs (simplifié) et aquí :

function array_flatten_recursive($array) { 
   if (!$array) return false;
   $flat = array();
   $RII = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
   foreach ($RII as $value) $flat[] = $value;
   return $flat;
}

Le grand avantage de cette méthode est qu'elle permet de suivre la profondeur de la récursion, si vous en avez besoin lors de l'aplatissement.
Ceci produira un résultat :

$array = array( 
    'A' => array('B' => array( 1, 2, 3)), 
    'C' => array(4, 5) 
); 
print_r(array_flatten_recursive($array)); 

#Returns: 
Array ( 
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
)

3 votes

Remarque : à utiliser uniquement pour les tableaux de primitives. "RecursiveArrayIterator traite tous les objets comme ayant des enfants, et essaie de récursionner en eux". php.net/manual/fr/class.recursivearrayiterator.php#106519

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X