sql >> Database >  >> RDS >> Mysql

Hoe kan ik genummerde rijen in HTML-tabel vullen op basis van het feit of ze overeenkomen met het rijnummer?

Op basis van uw vorige vraag, elke ustartlocation is uniek (vandaar dat je het kunt gebruiken als index in je $devices reeks). Met hetzelfde concept zou je de $devices . kunnen invullen array van "ustartlocation naar (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'];
    }
}

Omdat je display-loop al door elke U . gaat en geeft het toegewezen apparaat weer, u hoeft geen ander gedeelte te wijzigen. Het voorbehoud hierbij is echter dat de apparaatnaam herhaalt voor elke U in plaats van span het. Om te overspannen is, zullen we wat meer werk moeten verzetten.

Om te beginnen zouden we gewoon de usize . kunnen opslaan in de $devices array in plaats van elke individuele positie in te vullen. Om later veel extra werk/berekeningen te voorkomen, slaan we ook een "placeholder"-apparaat op voor elke extra positie.

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

Vervolgens controleert u in uw display-loop of de huidige positie een tijdelijke aanduiding is of niet (zo ja, toon dan gewoon de U en niets doen voor het apparaat; als dit niet het geval is, geeft u het apparaat weer, of 'leeg'). Om het "span"-effect voor elk apparaat te bereiken, stellen we de rowspan van de cel in gelijk aan de usize . van het apparaat . Als het 1 is , het zal een enkele cel zijn; 2 , het zal 2 rijen beslaan, enz (dit is de reden waarom "niets doen" voor het apparaat op de tijdelijke aanduiding-rijen zal werken):

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

Dus, zoals te zien is - de eerste methode hierboven die het apparaat eenvoudig herhaalt voor elke U het overspant is veel eenvoudiger. De tweede methode zal echter een gebruiksvriendelijker scherm opleveren. Het is uw voorkeur welke methode u wilt gebruiken en welke volgens u in de toekomst beter te onderhouden zal zijn.

UPDATE (code-fix &multi-direction spanning)
Ik wist niet dat je tabel in aflopende volgorde werd gebouwd, dus ik had de ustartlocation als de "toplocatie" die een foutieve rij/celverschuiving veroorzaakte. Ik heb de bovenstaande code aangepast om een ​​"toplocatie" correct in te stellen op basis van de ustartlocation en usize voor elk apparaat waarmee dat probleem wordt opgelost.

Als alternatief, omdat richting al dan niet belangrijk kan zijn, heb ik de $devices . aangepast -vullus (hieronder) ter ondersteuning van het maken van een rij-span die ofwel . gaat naar boven of naar beneden, volledig afhankelijk van de vlag die u opgeeft. De enige code die je hoeft te veranderen (als je al de aangepaste weergave-loop van boven hebt) is de while lus die $devices vult :

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

Dit nieuwe codeblok zal, als de usize overspant meer dan 1, bepaal de "bovenste cel" en "onderste cel" voor het huidige apparaat. Als u naar boven overspant , de bovenste cel is ustartlocation + usize - 1; als je naar beneden overspant , het is gewoon ustartlocation . Op deze manier wordt ook de bodemlocatie bepaald.



  1. PHP- en Mysql-query, gebruik PHP om rij naar kolommen te converteren

  2. mysql verander alle waarden in een kolom

  3. Geavanceerde SQL:uitvoer van de geparametriseerde functie met tabelwaarde in SQL-tabel invoegen

  4. Twee tafels, met een op veel relatie. Hoe waarden samen te voegen zonder dubbele rijen?