2010-08-11 19 views
10

In base allo PHP Manual, chiamare array_map con un callback NULL provoca l'esecuzione di una funzione "zip", creando una matrice di array di elementi paralleli dagli array dati.C'è un modo migliore per trasporre un array 2D PHP?

Ad esempio:

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

cede

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

Questo è anche equivalente a recepire la matrice

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

Al momento, sembra questo è il modo più vicino (utilizzando built -in funzioni) è possibile trasporre una matrice, ad eccezione del fatto che array_map prende una lista di arr ays, non una serie di array.

In un certo codice sto lavorando, ho bisogno di trasporre un array di array, non un elenco di array, così ho fatto questo work-around:

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

Tuttavia, questo si sente molto sporco e maldestro .

E così mi chiedo:
Esiste un modo migliore per trasporre una matrice 2D con PHP, oltre a un'implementazione personalizzata?

risposta

4

No. Questo è il più elegante.

2

Se davvero si vuole evitare il array_merge, utilizzare array_unshift anteporre il NULL al $array_of_arrays invece:

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

Naturalmente non è un one-liner più: P

+0

E altera '$ array_of_arrays' se vorrei utilizzare in un secondo momento, quindi avrei dovuto' array_shift ($ array_of_arrays) 'dopo ... –

+0

@ Austin Hyde: vero. puoi semplicemente fare una copia dell'array: '$ array_of_arrays = $ my_arrays_of_arrays' before – user102008

+0

Funziona solo se le matrici sono classificate> 1 – gurghet

1

Aggiornamento per PHP 5.6:

Possiamo sfruttare l'operatore "splat" di PHP 5.6 per rendere questa operazione molto più pulita con l'argomento decompressione:

array_map(null, ...$array_of_arrays); 

Ad esempio:

[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' 
// ) 
//) 
Problemi correlati