2010-03-18 23 views

Respuesta

8

No estoy seguro si te conviene, ya que es PHP> = sólo el 5,3, pero aquí hay una solución posible, usando array_walk_recursive y un cierre(ver Anonymous functions):

$array = array(
    array(1, 2, 3), 
    array(4, 5, 6), 
    array(7), 
); 

$result = array(); 
array_walk_recursive($array, function ($value, $key) use (& $result) { 
    $result[] = $value; 
}); 
var_dump($result); 

Y el resultado:

array 
    0 => int 1 
    1 => int 2 
    2 => int 3 
    3 => int 4 
    4 => int 5 
    5 => int 6 
    6 => int 7 

Básicamente, el cierre es la única forma en que tengo esto para wo rk: se usa para importar la variable $result, por referencia, a la función anónima.



Y, para publicarlo, el único que tiene este trabajo para PHP 5.2 (es decir, no usar un cierre) es con esto:

$result = array(); 
array_walk_recursive($array, 'my_func', & $result); 
var_dump($result); 

function my_func($value, $key, & $result) { 
    $result[] = $value; 
} 

¿Cuál funciona también - pero levanta una advertencia:

Deprecated: Call-time pass-by-reference has been deprecated 

Por desgracia, no he encontrado una manera de conseguir que esto funcione sin pasar por referencia a $result de llamadas en tiempo :-(
(Tal vez alguien tiene una idea, acerca de cómo hacer eso?)

+0

+1. Aunque tengo una respuesta que no usa cierres, esta fue mi primera idea de cómo hacerlo. Responder las preguntas de PHP será más divertido cuando PHP5.3 se vuelva más común. – Yacoby

+0

@Yacoby: PHP 5.3 FTW! * (las funciones anónimas y los cierres son una cosa que me gustaría poder usar en el trabajo ... Pero estamos usando PHP 5.2 ;-() * –

1

hacen un array_merge() en cada miembro separado.

$test = Array 
(
    "0" => Array 
     (
      0 => 1, 
      1 => 2, 
      2 => 3, 
     ), 
    "1" => Array 
     (
      0 => 4, 
      1 => 5, 
      2 => 6, 
     ), 
    "2" => Array 
     (
      0 => 7, 
     ) 
); 

print_r(array_merge($test[0],$test[1],$test[2])); 
// Array ([0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7) 
1

bajo php 5.3 esto debe ser muy agradable y conveniente, debido a que los elementos de la matriz utilizados por array_reduce se interpretan como mixto en lugar de fijo como número entero

así

print_r(array_reduce($test, 'array_merge')) 

No lo he probado - no hay copia de 5.3 - al menos en teoría que debería hacerlo. Debajo de < 5.3 obtendrá errores.

Tenga en cuenta que esto solo combina el nivel superior de la matriz, a diferencia de la solución que usa array_walk_recursive.

+1

+1 para ver el cambio reciente en array_reduce. Pero, debe proporcionar una matriz inicial para comenzar. array_reduce ($ aNestedArray, 'array_merge', array()) – goat

1
$flattened = call_user_func_array('array_merge', $array); 
Cuestiones relacionadas