2015-05-06 7 views
5

Per esempio, se una matrice è:creare trasporre matrice utilizzando php

1 2 
3 4 
5 6 

Poi trasposta della matrice sopra sarà:

1 3 5 
2 4 6 

Questo è il mio codice corrente:

<?php 

    // transpose matrix 
    $trans = array(
     array(1, 2), 
     array(3, 4), 
     array(5, 6) 
    ); 

    foreach ($trans as $key => $val){ 
     foreach ($trans[$key] as $k => $v){ 
      echo $v; 
     } 
    } 

?> 

risposta

15

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
+0

grazie, è un lavoro :) –

+1

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

+0

Ora direi che è una ** buona ** spiegazione! E una risposta davvero bella. – Rizier123

Problemi correlati