2015-05-06 13 views
6

Voglio ruotare una matrice di 90 gradi in senso orario. Ciò equivale a rendere la prima colonna nell'ingresso la prima riga dell'output, la seconda colonna dell'ingresso la seconda riga dell'output e la terza colonna dell'input alla terza riga dell'output. Si noti che il fondo della colonna = l'inizio della riga, a causa della rotazione di 90 gradi.Come posso ruotare di un array 2d in php di 90 gradi

Ad esempio:

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

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

Quello che so è ho prima recepire la matrice e poi scambiare le colonne per ruotare la matrice di 90 gradi. Come può essere applicato a php?

+0

Qual è la struttura dei dati? Vuoi solo stampare la tua nuova matrice? – Niols

+0

numeri, voglio solo ruotare la matrice come puoi vedere nel post –

risposta

2

php non ha concetti come "trasporre" per una matrice senza aggiungere una sorta di libreria di algebra lineare. si può fare in modo nativo dal NSEGNARE attraverso la matrice e scambiando alcuni indici

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

Se vuoi ruotare la matrice più di una volta, dovrai correggere i tasti per l'array esterno. Aggiungi '$ mat90 = array_values ​​($ mat90);' prima 'return $ mat90;' – daggerhart

6

vi ho mostrato come trasporre una matrice in risposta ad un previous question, per ruotare di 90 gradi, uso che trasposizione logica, e poi invertire la ordine dei valori in ciascuna riga in volta:

$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

Questo è brillante, grazie! Sto ancora cercando di capire come funziona ... – Gannet

+0

@Gannet - [Una risposta che ho fornito a una domanda simile qui fornisce una spiegazione] (http://stackoverflow.com/questions/30082814/create-transpose-matrix-using -PHP/30082922 # 30082922) –

2

Un'altra opzione affidabile:

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

Meno intelligente di @ mark-baker di gran lunga. Forse più chiaro.

Problemi correlati