2011-12-23 22 views
35

He estado golpeando mi cabeza en este desde hace un tiempo.Convertir una matriz multidimensional en una matriz unidimensional

que tienen esta matriz multidimensional:

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 
     ) 

y necesito conseguir esto:

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

¿Alguna idea?

Todas las demás soluciones que encontré resuelven matrices multidimensionales con diferentes claves. Mis matrices usan solo teclas numéricas simples.

+0

¿Pueden las matrices anidar más de un nivel? –

+1

¿Duplicado de [cómo aplanar una matriz multidimensional?] (Http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array) y [muchos otros] (http://stackoverflow.com/búsqueda? q =% 5Bphp% 5D + aplastar + mutlidimensional + matriz). – deceze

+0

[mirar @ mi solución en este post] [1] [1]: http://stackoverflow.com/questions/6940217/multidimensional-array-to-array/13143579#13143579 – Dexy86

Respuesta

2

SOLUCIÓN: Utilicé la solución de hakre, aunque también probé la solución de deceze y funciona igual. Escribí:

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

Simple.

+0

funciona para mí, no sé por qué votaron negativamente, ¿hay algún problema con esta manera? – Dheeraj

+0

Funciona para mí. Creo que esta es una respuesta mucho más clara y clara que la más votada. Me pregunto por qué otros no ven esto. :/ – Jefsama

+0

Funciona solo para matrices unidimensionales. Para uso mixto, la única solución de trabajo es '$ new = iterator_to_array (new \ RecursiveIteratorIterator (new \ RecursiveArrayIterator ($ myArray)), null);' – stamster

9

Esto es realmente todo lo que hay que hacer:

foreach($array as $subArray){ 
    foreach($subArray as $val){ 
     $newArray[] = $val; 
    } 
} 
+0

no es lineal o logN – Bsienn

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

Ejemplo:

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

Resultado:

array[1, 2, 3, 4, 5, 6]; 
+0

Esta no es necesariamente la mejor manera de hacerlo, puede ser algo críptico para uno; Simplemente me gusta el enfoque funcional y escribir frases ingeniosas para el ejercicio. ; o) – deceze

+2

El segundo argumento podría ser simplemente 'array_merge'. – raugfer

36

La función de PHP array_merge­Docs puede aplanar su matriz:

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

En caso de que la matriz original tiene una profundidad superior a 2 niveles, el SPL en PHP tiene una RecursiveArrayIterator puede utilizar para aplanarlo:

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

Ver también: How to Flatten a Multidimensional Array?.

+1

SPL La clase 'RecursiveIteratorIterator' es la mejor solución posible cuando tienes una matriz mixta (claves con N dimensión y claves como cadenas/ints/lo que no sea matriz). – stamster

0
$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 (una matriz DIMENTIONAL):

$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"] 
3
foreach ($a as $v1) { 
    foreach ($v1 as $v2) { 
     echo "$v2\n"; 
    } 
} 

donde $ a es el nombre de la matriz. for details

+2

Esto no responde la pregunta completamente, quiere llenar una nueva matriz con los valores . (Sin embargo, creo que encontraron una solución desde los 2 años que esto se publicó) – Bun

+0

también creo que encontraron el resultado, pero solo quería compartir mi opinión. gracias por el comentario, no hay resentimiento :) – n00b

2

A partir de PHP 5.3 la solución más corta parece ser array_walk_recursive() con el nuevo cierre de sintaxis:

function flatten(array $array) { 
    $return = array(); 
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; }); 
    return $return; 
} 
1

En PHP5.6 hay otra manera de resolver este problema, la combinación de las funciones, array_shift() a elimine los primeros elementos de la matriz original, array_pus() para agregar elementos a una nueva matriz, lo importante es que el operador ... splapt/elipse descomprimirá el retorno de array_shitf() como un argumento.

<?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); 

Salida:

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

Example - ideone

+0

Funciona solo para matrices de dimensiones únicas. Para uso mixto, la única solución de trabajo es '$ new = iterator_to_array (new \ RecursiveIteratorIterator (new \ RecursiveArrayIterator ($ myArray)), null);' – stamster

1

que había utilizado este código para resolver mismo tipo de problema. así que también puedes probar esto.

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; 
} 
Cuestiones relacionadas