2010-08-11 22 views
10

Según la PHP Manual, llamando array_map con una devolución de llamada NULL hace que se realice una función de "zip", la creación de una matriz de matrices de elementos paralelos de las matrices dadas.¿Hay una mejor manera de transponer una matriz PHP 2D?

Por ejemplo:

array_map(NULL,array(1,2,3),array('a','b','c')); 

produce

array(array(1,'a'),array(2,'b'),array(3,'c')) 

Esto también es equivalente a la transposición de la matriz

array(array(1,2,3),array('a','b','c')) 

En este momento, parece que este es el camino más cercano (utilizando una función -in funciones) puede transponer una matriz, excepto que array_map toma una lista de arr ays, no una matriz de matrices.

En algún código que estoy trabajando, tengo que transponer una matriz de matrices, no una lista de matrices, así que hice esta solución alternativa:

call_user_func_array('array_map',array_merge(array(NULL),$array_of_arrays)) 

Sin embargo, esto se siente muy sucia y torpe .

Y entonces pregunto:
¿Hay una mejor manera de transponer una matriz 2D con PHP, además de una implementación personalizada?

Respuesta

4

Nop. Esa es la más elegante.

2

Si realmente quiere evitar la array_merge, utilice array_unshift estar precedidos por NULL al $array_of_arrays lugar:

array_unshift($array_of_arrays, NULL); 
call_user_func_array('array_map', $array_of_arrays); 

Por supuesto que no es una sola línea más: P

+0

y altera '$ array_of_arrays' si me gustaría usarlo más tarde, por lo que tendría que' array_shift ($ array_of_arrays) 'después ... –

+0

@ Austin Hyde: cierto. simplemente puede hacer una copia de la matriz: '$ array_of_arrays = $ my_arrays_of_arrays' de antemano – user102008

+0

Esto funciona solo si las matrices son de rango> 1 – gurghet

1

Actualización para PHP 5.6:

Podemos aprovechar el operador "splat" de PHP 5.6 para hacer que esta operación sea mucho más limpia con el desempaquetado de argumentos:

array_map(null, ...$array_of_arrays); 

Por ejemplo:

[1] boris> $arr2d = [ [1,2,3], ['a','b','c'] ]; 
// array(
// 0 => array(
//  0 => 1, 
//  1 => 2, 
//  2 => 3 
// ), 
// 1 => array(
//  0 => 'a', 
//  1 => 'b', 
//  2 => 'c' 
// ) 
//) 
[2] boris> array_map(null, ...$arr2d); 
// array(
// 0 => array(
//  0 => 1, 
//  1 => 'a' 
// ), 
// 1 => array(
//  0 => 2, 
//  1 => 'b' 
// ), 
// 2 => array(
//  0 => 3, 
//  1 => 'c' 
// ) 
//) 
Cuestiones relacionadas