C'è un bizzarro modo PHP per trasporre un array 2d:
$trans = array(
array(1, 2),
array(3, 4),
array(5, 6)
);
array_unshift($trans, null);
$trans = call_user_func_array('array_map', $trans);
var_dump($trans);
Demo
EDIT approccio più semplice utilizzando PHP 5.6 matrice disimballaggio
Con l'introduzione dell'argomento matrice disimballaggio funzione in PHP 5.6, possiamo semplificare questo ulteriormente:
$trans = array(
array(1, 2),
array(3, 4),
array(5, 6)
);
$trans = array_map(null, ...$trans);
var_dump($trans);
MODIFICA Spiegazione
Citando la documentazione PHP per la array_map() function:
Un uso interessante di questa funzione è di costruire un array di array, che può essere facilmente eseguita utilizzando NULL come il nome della funzione callback
(Vedere l'esempio # 4 da quella pagina docs per un esempio di ciò che fa)
Il array_unshift($trans, null)
che eseguiamo prima è condizione che callback NULL, e usiamo call_user_func_array()
perché non sappiamo necessariamente quanti valori ci sono nel nostro array $trans
. Quello che stiamo facendo utilizzando tale call_user_func_array()
è l'equivalente di:
$trans = array_map(NULL, $trans[0], $trans[1], $trans[2]);
per il tuo esempio array, in quanto il livello superiore del 2-D array ha tre elementi (tasti 0, 1 e 2).
In effetti, questo NULL callback scorre tutti gli array in parallelo prendere ogni valore da loro a sua volta, di costruire un nuovo array:
$maxArraySize = max(count($array[0], $array[1], $array[2]);
// $maxArraySize will have a value of 2 in your case,
// because your sub-arrays are all equal size
$newArray = [];
for($i = 0; $i < $maxArraySize; ++$i) {
$tmpArray = [];
$tmpArray[] = $array[0][$i];
$tmpArray[] = $array[1][$i];
$tmpArray[] = $array[2][$i];
$newArray[] = $tmpArray[];
}
Ci sono un paio di controlli supplementari in là
- non importa se i tuoi array sono associativi o enumerati in entrambe le dimensioni, perché accede all'elemento
$i
th, non all'indice
- Se i sotto-array non sono tutti della stessa lunghezza, allora effe pads ctively sub-array più brevi con valori nulli in base alla lunghezza del più lungo
- Non importa quante le matrici si passa, che possa funzionare con tutti loro in parallelo
grazie, è un lavoro :) –
Penso che una spiegazione di ciò che fa questo codice, potrebbe essere interessante per OP e futuri visitatori SO :) Ad es. cosa hanno a che fare 'array_unshift()' e 'NULL' con la firma di' array_map() '. E ciò che potrebbe aiutare a capire cosa sta succedendo qui, sarebbe aggiungere la "versione statica" di questo codice. – Rizier123
Ora direi che è una ** buona ** spiegazione! E una risposta davvero bella. – Rizier123