Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso popolare le righe numerate della tabella HTML in base al fatto che corrispondano al numero di riga?

Sulla base della tua domanda precedente, ogni ustartlocation è unico (ecco perché puoi usarlo come indice nei tuoi $devices Vettore). Usando lo stesso concetto, potresti popolare i $devices array da "ustartlocation a (ustartlocation + (usize - 1)) ".

$devices = array();
while($row = mysql_fetch_array($result_devices)) {
    $endLocation = ($row['ustartlocation'] + ($row['usize'] - 1));
    for ($location = $row['ustartlocation']; $location <= $endLocation; $location++) {
        $devices[$location] = $row['devicename'];
    }
}

Perché il tuo ciclo di visualizzazione scorre già attraverso ogni U e visualizza il dispositivo assegnato, non dovrebbe essere necessario modificare nessun'altra parte. Tuttavia, l'avvertenza è che il nome del dispositivo si ripeterà per ogni U invece di span esso. Per span it, dovremo lavorare ancora un po'.

Per iniziare, potremmo semplicemente memorizzare usize nel $devices array invece di riempire ogni singola posizione. Inoltre, per evitare molti lavori/calcoli extra in seguito, memorizzeremo anche un dispositivo "segnaposto" per ogni posizione aggiuntiva.

while($row = mysql_fetch_array($result_devices)) {
    // get the "top" location for the current device
    $topLocation = ($row['ustartlocation'] + $row['usize'] - 1);

    // populate the real position
    $devices[$topLocation] = $row;

    // generate a list of "placeholder" positions
    for ($location = ($topLocation - 1); $location >= $row['ustartlocation']; $location--) {
        $devices[$location] = 'placeholder';
    }
}

Successivamente, nel tuo ciclo di visualizzazione, controllerai se la posizione corrente è un segnaposto o meno (in tal caso, mostra semplicemente la U e non fare nulla per il dispositivo; in caso contrario, visualizzare il dispositivo o 'vuoto'). Per ottenere l'effetto "span" per ogni dispositivo, imposteremo il rowspan della cella uguale al usize del dispositivo . Se è 1 , sarà una singola cella; 2 , si estenderà su 2 righe, ecc (questo è il motivo per cui "non fare nulla" per il dispositivo sulle righe segnaposto funzionerà):

for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {   
    $u = $cabinets_sqlrow[2] - $i;
    echo "<tr>";
    echo '<td width="15px" align="right">' . $u . '</td>';
    if (isset($devices[$u])) {
        // we have a "device" here; if it's a "placeholder", do nothing!
        if ($devices[$u] != 'placeholder') {
            echo '<td width="150px" align="middle" rowspan="' . $devices[$u]['usize'] . '">' . $devices[$u]['devicename'] . '</td>';
        }
    } else {
        echo '<td width="150px" align="middle">empty</td>';
    }
    echo "</tr>";
}

Quindi, come si può vedere, il primo metodo sopra che ripete semplicemente il dispositivo per ogni U si estende è molto più semplice. Tuttavia, il secondo metodo presenterà una visualizzazione più intuitiva. È la tua preferenza su quale metodo desideri utilizzare e quale ritieni sarà più gestibile in futuro.

AGGIORNAMENTO (correzione del codice e spanning multidirezionale)
Non mi ero reso conto che la tua tabella era stata creata in ordine decrescente, quindi avevo ustartlocation come la "posizione principale" che ha causato uno spostamento errato di riga/cella. Ho corretto il codice sopra per impostare correttamente una "posizione principale" in base a ustartlocation e usize per ogni dispositivo che risolverà il problema.

In alternativa, poiché la direzione può essere importante o meno, ho personalizzato i $devices -populating loop (sotto) per supportare la creazione di un intervallo di righe che va o verso l'alto o verso il basso, completamente a seconda della bandiera specificata. L'unico codice che dovrai modificare (se hai già il display-loop personalizzato dall'alto) sarebbe il while ciclo che popola $devices :

$spanDevicesUpwards = true;
while($row = mysql_fetch_array($result_devices)) {
    if ($row['usize'] == 1) {
        $devices[$row['ustartlocation']] = $row;
    } else {
        $topLocation = ($spanDevicesUpwards ? ($row['ustartlocation'] + $row['usize'] - 1) : $row['ustartlocation']);
        $bottomLocation = ($spanDevicesUpwards ? $row['ustartlocation'] : ($row['ustartlocation'] - $row['usize'] + 1));

        $devices[$topLocation] = $row;
        for ($location = ($topLocation - 1); $location >= $bottomLocation; $location--) {
            $devices[$location] = 'placeholder';
        }
    }
}

Questo nuovo blocco di codice lo farà, se usize si estende su più di 1, determina la "cella superiore" e la "cella inferiore" per il dispositivo corrente. Se ti stai estendendo verso l'alto , la cella in alto è ustartlocation + usize - 1; se ti stai estendendo verso il basso , è semplicemente ustartlocation . Anche la posizione inferiore viene determinata in questo modo.