sql >> Databáze >  >> RDS >> Mysql

Jak mohu naplnit číslované řádky tabulky HTML na základě toho, zda odpovídají číslu řádku?

Na základě vaší předchozí otázky, každé ustartlocation je jedinečný (proto ho můžete použít jako index ve vašem $devices pole). Pomocí stejného konceptu byste mohli naplnit $devices pole z "ustartlocation na (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'];
    }
}

Protože vaše zobrazovací smyčka již prochází každým U a zobrazí přiřazené zařízení, neměli byste upravovat žádnou další část. Upozornění na to je, že název zařízení se bude opakovat za každé U místo span to. Do span to, budeme muset udělat trochu víc práce.

Pro začátek bychom mohli uložit usize v $devices pole místo vyplňování každé jednotlivé pozice. Abychom později předešli spoustě práce/výpočtů navíc, uložíme také „zástupné“ zařízení pro každou další pozici.

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

Dále ve vaší zobrazovací smyčce zkontrolujete, zda je aktuální pozice zástupným symbolem nebo ne (pokud ano, stačí zobrazit U a nedělat nic pro zařízení; pokud není, zobrazte zařízení nebo 'prázdné'). Abychom dosáhli efektu „rozpětí“ pro každé zařízení, nastavíme rowspan buňky rovná usize zařízení . Pokud je to 1 , bude to jedna buňka; 2 , bude zahrnovat 2 řádky atd. (proto bude fungovat „nicnedělání“ pro zařízení na zástupných řádcích):

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

Takže, jak je vidět – první výše uvedená metoda, která jednoduše opakuje zařízení pro každé U je mnohem jednodušší. Druhý způsob však nabídne uživatelsky přívětivější zobrazení. Záleží na vás, kterou metodu chcete použít a která bude podle vás v budoucnu lépe udržovatelná.

AKTUALIZACE (oprava kódu &multi-direction spanning)
Neuvědomil jsem si, že vaše tabulka byla sestavována v sestupném pořadí, takže jsem měl ustartlocation jako "horní umístění", které způsobilo chybný posun řádku/buňky. Výše uvedený kód jsem opravil tak, aby správně nastavil „nejvyšší umístění“ na základě ustartlocation a usize pro každé zařízení, které daný problém vyřeší.

Případně, protože směr může nebo nemusí být důležitý, upravil jsem $devices -vyplňovací smyčka (níže) pro podporu vytváření rozsahu řádků, který jde oba nahoru nebo dolů, zcela v závislosti na příznaku, který určíte. Jediný kód, který budete muset změnit (pokud již máte přizpůsobenou smyčku zobrazení shora), bude while smyčka, která vyplní $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';
        }
    }
}

Tento nový blok kódu bude, pokud usize přesahuje více než 1, určete "horní buňku" a "spodní buňku" pro aktuální zařízení. Pokud se pohybujete nahoru , horní buňka je ustartlocation + usize - 1; pokud se pohybujete směrem dolů , je to jednoduše ustartlocation . Tímto způsobem je také určeno spodní umístění.



  1. Vytvoření sekvence na existující tabulce

  2. Použití proměnné v příkazu SQL LIKE

  3. Maximální délka SQL dotazu

  4. Vrací 1 nebo 0 v konkrétním SQL dotazu