Reverse orizzontale e verticale per una tabella HTML

3

Esiste un array bidimensionale che descrive una tabella HTML. Ogni elemento dell'array è composto da:

  • il contenuto della cella
  • rowspan
  • colspan

Ogni riga di questo array bidimensionale corrisponde a <td> celle di un <tr> della tabella che il mio software dovrebbe generare.

Devo "invertire" la matrice (interscambio verticale e direzione orizzontale).

Pertanto ho considerato l'algoritmo basato su questa idea: creare una matrice rettangolare della dimensione della tabella e memorizzare in ogni elemento di questa matrice l'indice corrispondente dell'elemento dell'array sopra menzionato. (Si noti che due elementi della matrice possono essere identici a causa di rowspan / colspan.) Quindi potrei usare questa matrice per calcolare rowspan / colspan per la tabella invertita.

Ma questa idea mi sembra male. Qualche altro algoritmo?

Nota che programma in PHP.

    
posta porton 06.11.2013 - 15:32
fonte

2 risposte

1

L'unica difficoltà è trovare su quale colonna inizia una cella. Una volta che hai capito come fare, puoi raccogliere le celle per ogni colonna e stamparle come una fila, scambiando colspan e rowspan. Per trovare la colonna iniziale è necessario tenere traccia di quale parte delle posizioni della tabella viene utilizzata dalle celle precedenti. Ogni cella inizia alla successiva posizione disponibile.

Non conosco il php, quindi userò pseudocode.

L'input è una matrice che fornisce per ogni riga l'elenco delle celle di dimensioni variabili. L'output è nello stesso formato.

Supporrò che la tabella riempia un'area rettangolare. In caso contrario, alcuni padding con celle vuote saranno necessari nell'output.

function reverse( table:array of array of cell ) 
{
  used = new array of array of boolean.
  output = new array of array of cell

  for r = 0 to table.size()-1 {
    // process row r
    c = 0;
    for each cell in table[r] {
      // skip to next position
      while used[r][c] { c++; }
      // cell starts at column c.  add it to the output
      cell2 = cell with rowspan and colspan values switched
      output[c].append(cell2)
      // mark used table positions (use 1 for missing rowspan/colspan)
      for i = 0 to cell.rowspan-1 {
        for j = 0 to cell.colspan-1 {
          used[r+i][c+j] = true;
        }
      }
    }
  }

  return output;
}

Spero che tu possa tradurlo in php.

    
risposta data 21.08.2014 - 21:55
fonte
-2

array_column () prenderà l'ennesimo elemento di ogni sottoarray in una matrice multidimensionale e produrrà una matrice da quella "colonna". Se si esegue questa operazione più volte per aumentare l'indice n, è possibile costruire un nuovo array multidimensionale in cui ciascuna delle righe è una colonna dall'array di input. L'esempio di seguito spiega il fatto che non tutti i sottoarray potrebbero essere della stessa lunghezza e utilizza la lunghezza del più lungo come numero di colonne (per evitare di perdere dati). (Spiegazione aggiunta durante la modifica.)

// Assumes source array is $input

// find the "longest" subarray
$max = 0;
foreach ($input as $subarray)
  $max = max($max, count($subarray));

// generate a transposed output array
$output = array();
for ($i = 0; $i < $max; ++$i)
  $output[] = array_column($input, $i);

Vedi link

    
risposta data 22.11.2013 - 18:11
fonte

Leggi altre domande sui tag