2015-05-06 18 views
6

Chcę obrócić matrycę o 90 stopni w prawo. Sprowadza się to do tego, aby pierwsza kolumna na wejściu była pierwszym rzędem wyjścia, druga kolumna wejścia drugim rzędem wyjścia, a trzecia kolumna wejścia trzecim rzędem wyjścia. Zauważ, że dolna część kolumny = początek rzędu, z powodu obrotu o 90 stopni.Jak mogę obrócić tablicę 2d w php o 90 stopni?

Na przykład:

$matrix= [[1, 2, 3] 
      [4, 5, 6], 
      [7, 8, 9]]; 

rotate90degrees($matrix)=  [[7, 4, 1], 
           [8, 5, 2], 
           [9, 6, 3]] 

Co wiem, to ja pierwszy transpozycji macierzy, a następnie zamienić kolumny aby obrócić matrycę o 90 stopni. W jaki sposób można to zastosować do php?

+0

Jaka jest twoja struktura danych? Czy chcesz wydrukować tylko swoją matrycę? – Niols

+0

numery, po prostu wana obracam matrycą jak widać w poście –

Odpowiedz

2

php nie ma koncepcji takich jak "transpozycja" dla macierzy bez dodawania jakiejś biblioteki algebry liniowej. można to zrobić natywnie przez eaching przez matrycę i zamiana niektórym indeksy

<?php 

function rotate90($mat) { 
    $height = count($mat); 
    $width = count($mat[0]); 
    $mat90 = array(); 

    for ($i = 0; $i < $width; $i++) { 
     for ($j = 0; $j < $height; $j++) { 
      $mat90[$height - $i - 1][$j] = $mat[$height - $j - 1][$i]; 
     } 
    } 

    return $mat90; 
} 

$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; 
print_r($mat); 
//123 
//456 
//789 
print_r(rotate90($mat)); 
//741 
//852 
//963 


$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9], ["a", "b", "c"]]; 
print_r($mat); 
//123 
//456 
//789 
//abc 
print_r(rotate90($mat)); 
//a741 
//b852 
//c963 
+0

Jeśli chcesz obracać matrycę więcej niż raz, musisz naprawić klucze dla zewnętrznej tablicy. Dodaj '$ mat90 = array_values ​​($ mat90);' before 'return $ mat90;' – daggerhart

6

pokazałem jak transpozycji tablicę w odpowiedzi na previous question, aby obrócić o 90 stopni, używanie że transpozycji logiki, a następnie w odwrotnej kolejność wartości w każdym wierszu w kolejności:

$matrix = [ 
    [1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9], 
]; 

array_unshift($matrix, null); 
$matrix = call_user_func_array('array_map', $matrix); 
$matrix = array_map('array_reverse', $matrix); 
var_dump($matrix); 

Demo

+1

To jest genialne, dziękuję! Nadal próbuję zrozumieć, jak to działa ... – Gannet

+0

@Gannet - [Odpowiedź, którą podałem na podobne pytanie tutaj, zawiera wyjaśnienie] (http://stackoverflow.com/questions/30082814/create-transpose-matrix-using -php/30082922 # 30082922) –

2

innego niezawodnego opcjonalnie:

function rotateMatrix90($matrix) 
{ 
    $matrix = array_values($matrix); 
    $matrix90 = array(); 

    // make each new row = reversed old column 
    foreach(array_keys($matrix[0]) as $column){ 
     $matrix90[] = array_reverse(array_column($matrix, $column)); 
    } 

    return $matrix90; 
} 

Mniej sprytne niż przy użyciu znaku @ piekarza. Może bardziej jasne.

Powiązane problemy