2015-05-06 13 views
5

Zum Beispiel verwenden, wenn eine Matrix ist:erstellen transponieren Matrix php

1 2 
3 4 
5 6 

Dann obiger Matrix transponieren wird:

1 3 5 
2 4 6 

Dies ist mein aktueller Code:

<?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; 
     } 
    } 

?> 

Antwort

15

Es gibt eine schrullige PHP-Methode, um ein 2D-Array zu transponieren:

$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 einfacher Ansatz mit PHP 5.6 Array

Mit der Einführung des Array-Argument Auspacken Auspacken Funktion in PHP 5.6 können wir diese Vereinfachung noch weiter:

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

$trans = array_map(null, ...$trans); 
var_dump($trans); 

BEARBEITEN Erläuterung

von den PHP-Dokumente Zitiert für die array_map() function:

eine interessante Anwendung dieser Funktion ist ein Array von Arrays zu konstruieren, die leicht unter Verwendung von NULL als Name der Callback-Funktion durchgeführt werden kann

(siehe Beispiel # 4 von dieser docs Seite für ein Beispiel dafür, was das bedeutet)

Die array_unshift($trans, null), dass wir zuerst durchzuführen ist, dass NULL Rückruf bereitstellt, und wir verwenden call_user_func_array(), weil wir nicht unbedingt wissen, wie viele Werte es in unserem $trans Array gibt. Was wir tun, dass call_user_func_array() Verwendung ist das Äquivalent von:

$trans = array_map(NULL, $trans[0], $trans[1], $trans[2]); 

für Ihr Beispiel Array, weil die Top-Level des 2-D-Array drei Elemente hat (Tasten 0, 1 und 2).

effektiv, diese NULL Rückruf durchläuft alle Arrays parallel jeden Wert von ihnen wiederum nehmen ein neues Array zu bauen:

$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[]; 
} 

Es gibt ein paar zusätzliche Kontrollen dort

  • Es ist nicht wichtig, ob Ihre Arrays in jeder Dimension assoziativ oder enumeriert sind, da sie auf das Element $i und nicht auf den Index
  • zugreifen. Wenn die Sub-Arrays nicht alle die gleiche Länge haben, dann ist es effektiv ctively Pads den kürzeren Unteranordnungen mit Nullwerten die Länge der
  • längste passen in Es spielt keine Rolle, wie viele Arrays Sie passieren, wird es
  • mit ihnen allen parallel arbeiten
+0

danke, es ist Arbeit :) –

+1

Ich denke, eine Erklärung, was dieser Code tut, könnte für OP und zukünftige SO Besucher interessant sein :) ZB was die 'array_unshift()' und 'NULL' mit der Signatur von' array_map() 'zu tun haben. Und was könnte helfen, zu verstehen, was hier vor sich geht, wäre, die "statische Version" dieses Codes hinzuzufügen. – Rizier123

+0

Jetzt würde ich sagen, das ist eine ** gute ** Erklärung! Und eine wirklich nette Antwort. – Rizier123