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

Hvordan kan jeg udfylde HTML-tabelnummererede rækker baseret på, om de matcher rækkenummeret?

Baseret på dit tidligere spørgsmål, hver ustartlocation er unik (derfor kan du bruge det som et indeks i dine $devices array). Ved at bruge det samme koncept kan du udfylde $devices array fra "ustartlocation til (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'];
    }
}

Fordi din display-loop allerede itererer gennem hver U og viser den tildelte enhed, behøver du ikke at ændre nogen anden del. Advarslen til dette er dog, at enhedsnavnet vil gentages for hver U i stedet for span det. Til span det, bliver vi nødt til at gøre lidt mere arbejde.

Til at starte med kunne vi bare gemme usize i $devices række i stedet for at udfylde hver enkelt position. For at forhindre en masse ekstra arbejde/beregninger senere, gemmer vi også en "pladsholder"-enhed for hver ekstra position.

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

Dernæst vil du i din display-loop kontrollere, om den aktuelle position er en pladsholder eller ej (hvis det er tilfældet, skal du blot vise U og ikke gør noget for enheden; hvis den ikke er det, skal du vise enheden eller 'tom'). For at opnå "span"-effekten for hver enhed, indstiller vi cellens rowspan lig med enhedens usize . Hvis det er 1 , vil det være en enkelt celle; 2 , det vil strække sig over 2 rækker osv. (det er derfor, at "intet gøre" for enheden på pladsholderrækkerne fungerer):

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

Så som det kan ses - den første metoden ovenfor, der blot gentager enheden for hver U det spænder er meget enklere. Den anden metode vil dog præsentere en mere brugervenlig skærm. Det er din præference, hvilken metode du vil bruge, og hvilken du tror vil være mere vedligeholdelsesdygtig i fremtiden.

OPDATERING (kode-fix &multi-direction-spænder)
Jeg var ikke klar over, at din tabel blev bygget i faldende rækkefølge, så jeg havde ustartlocation som "øverste placering", hvilket forårsagede et fejlagtigt række/celleskift. Jeg har rettet koden ovenfor for korrekt at indstille en "topplacering" baseret på ustartlocation og usize for hver enhed, der løser problemet.

Alternativt, da retningen måske eller måske ikke er vigtig, har jeg tilpasset $devices -populating loop (nedenfor) for at understøtte oprettelse af en rækkevidde, der går enten opad eller nedad, helt afhængig af hvilket flag du angiver. Den eneste kode, du skal ændre (hvis du allerede har den tilpassede display-loop fra oven) ville være while sløjfe, der udfylder $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';
        }
    }
}

Denne nye kodeblok vil, hvis usize spænder over mere end 1, skal du bestemme "øverste celle" og "nederste celle" for den aktuelle enhed. Hvis du spænder opad , den øverste celle er ustartlocation + usize - 1; hvis du spænder nedad , det er simpelthen ustartlocation . Bundplaceringen bestemmes også på denne måde.



  1. SQL Server svarende til MySQL's EXPLAIN

  2. Django og PostgreSQL - værdien er for lang til, at typetegn varierer (512)

  3. MySQL kontrollere, om en tabel eksisterer uden at kaste en undtagelse

  4. Inkluderer MS SQL Servers mellem rækkeviddegrænserne?