Transformer un réseau multidimensionnel en réseau unidimensionnel

je me cogne la tête depuis un moment.

j'ai ce tableau multidimensionnel:

Array
(
    [0] => Array
        (
            [0] => foo
            [1] => bar
            [2] => hello
        )

    [1] => Array
        (
            [0] => world
            [1] => love
        )

    [2] => Array
        (
            [0] => stack
            [1] => overflow
            [2] => yep
            [3] => man
        )

Et j'ai besoin d'obtenir ceci:

Array
(
    [0] => foo
    [1] => bar
    [2] => hello
    [3] => world
    [4] => love
    [5] => stack
    [6] => overflow
    [7] => yep
    [8] => man
)

des idées?

toutes les autres solutions j'ai trouvé des tableaux multidimensionnels avec différentes clés. Mes tableaux n'utilisent que des clés numériques simples.

42
demandé sur Tomi Seus 2011-12-23 05:17:36

10 réponses

array_reduce($array, 'array_merge', array())

exemple:

$a = array(array(1, 2, 3), array(4, 5, 6));
$result = array_reduce($a, 'array_merge', array());

résultat:

array[1, 2, 3, 4, 5, 6];
65
répondu deceze 2015-06-18 07:15:43

le PHP array_merge Docs fonction peut aplatir votre tableau:

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

dans le cas où le tableau original a une plus grande profondeur que 2 niveaux, le SPL en PHP a un RecursiveArrayIterator vous pouvez utiliser pour l'aplatir:

$flat = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)), 0);

Voir aussi: Comment Aplatir un Tableau Multidimensionnel? .

36
répondu hakre 2017-05-23 12:10:01

C'est vraiment tout ce qu'il y a à faire:

foreach($array as $subArray){
    foreach($subArray as $val){
        $newArray[] = $val;
    }
}
9
répondu Grexis 2011-12-23 01:20:39
foreach ($a as $v1) {
    foreach ($v1 as $v2) {
        echo "$v2\n";
    }
}

où $a est votre nom de tableau. pour plus de détails

3
répondu n00b 2014-08-15 18:15:40

à partir de PHP 5.3 la solution la plus courte semble être array_walk_recursive () avec la nouvelle syntaxe de fermeture:

function flatten(array $array) {
    $return = array();
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
    return $return;
}
3
répondu Hamid Naghipour 2016-06-06 10:55:12

à partir de PHP 5.6 cela peut être fait plus simplement avec argument unpacking .

$flat = array_merge(...$array);
3
répondu Don't Panic 2018-04-25 16:04:51

en PHP5.6 Il y a une autre façon de résoudre ce problème, en combinant les fonctions, array_shift() pour supprimer le premier élément du tableau original, array_pus() pour ajouter des éléments d'un nouveau tableau, la chose importante est l'opérateur de ... splapt/elipse il va déballer le retour de array_shitf() comme un argument.

<?php

$arr = [
        ['foo', 'bar', 'hello'],
        ['world', 'love'],
        ['stack', 'overflow', 'yep', 'man', 'wow']
    ];

$new = [];
while($item = array_shift($arr)){
    array_push($new, ...$item);
}

print_r($new);

sortie:

Array
(
    [0] => foo
    [1] => bar
    [2] => hello
    [3] => world
    [4] => love
    [5] => stack
    [6] => overflow
    [7] => yep
    [8] => man
    [9] => wow
)

Exemple - ideone

1
répondu rray 2016-07-14 23:50:16

j'avais utilisé ce code pour résoudre le même type de problème. donc tu peux aussi essayer ça.

function array_flatten($array) { 

 if (!is_array($array))  
{ 
  return FALSE;  
}  
  $result = array(); 
foreach ($array as $key => $value)
{
  if (is_array($value))  
  {
   $result = array_merge($result, array_flatten($value));
  } 
  else  {
  $result[$key] = $value;   
  }  
}   
return $result; 
} 
1
répondu Kunwar Kishor 2017-01-04 09:05:43
$blocked_dates = array(
                    '2014' => Array
                        (
                            '8' => Array
                                (
                                    '3' => '1',
                                    '4' => '1',                                     
                                    '6' => '1',                                     
                                    '10' => '1',
                                    '15' => '1',
                                    '25' => '1'

                                )

                        ),
                    '2015' => Array
                        (
                            '9' => Array
                                (
                                    '3' => '1',
                                    '4' => '1',                                    
                                    '6' => '1',                                     
                                    '10' => '1',
                                    '15' => '1',
                                    '25' => '1'

                                )

                        )    

                );

RESUTL (ONE DIMENSIONAL ARRAY) :

$unavailable_dates = array();
foreach ($blocked_dates as $year=>$months) {

    foreach ($months as $month => $days) {

        foreach ($days as $day => $value) {

            array_push($unavailable_dates,"$year-$month-$day");
        }

    }
}



$unavailable_dates = json_encode($unavailable_dates);
print_r($unavailable_dates);

OUTPUT : ["2014-8-3","2014-8-4","2014-8-6","2014-8-10","2014-8-15","2014-8-25","2015-9-3","2015-9-4","2015-9-6","2015-9-10","2015-9-15","2015-9-25"]
0
répondu Roman 2014-08-14 21:58:01

cela fera array_walk_recursive($tableau, function($a) utilisation (&$retour) { $retour[] = $a; });

0
répondu Rutunj sheladiya 2018-07-16 09:34:19