Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich nummerierte Zeilen in HTML-Tabellen füllen, je nachdem, ob sie mit der Zeilennummer übereinstimmen?

Basierend auf Ihrer vorherigen Frage, jeder ustartlocation ist einzigartig (daher können Sie es als Index in Ihren $devices verwenden Reihe). Mit demselben Konzept könnten Sie die $devices füllen Array von "ustartlocation zu (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'];
    }
}

Weil Ihre Display-Schleife bereits durch jedes U iteriert und das zugewiesene Gerät anzeigt, sollten Sie keinen anderen Teil ändern müssen. Die Einschränkung dabei ist jedoch, dass sich der Gerätename wiederholt für jedes U statt span es. spannen es, müssen wir ein wenig mehr Arbeit erledigen.

Zu Beginn könnten wir einfach die usize speichern in den $devices Array statt jede einzelne Position auszufüllen. Um später viel zusätzliche Arbeit/Berechnungen zu vermeiden, speichern wir auch einen "Platzhalter" für jede zusätzliche 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';
    }
}

Als nächstes überprüfen Sie in Ihrer Anzeigeschleife, ob die aktuelle Position ein Platzhalter ist oder nicht (wenn ja, zeigen Sie einfach das U an und nichts für das Gerät tun; ist dies nicht der Fall, zeigen Sie das Gerät oder „leer“ an). Um den „Span“-Effekt für jedes Gerät zu erzielen, legen wir den rowspan der Zelle fest gleich der usize des Geräts . Wenn es 1 ist , es wird eine einzelne Zelle sein; 2 , es erstreckt sich über 2 Zeilen usw. (deshalb funktioniert "nichts tun" für das Gerät in den Platzhalterzeilen):

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

Also, wie man sieht - die erste obige Methode, die einfach das Gerät für jedes U wiederholt es überspannt ist viel einfacher. Die zweite Methode bietet jedoch eine benutzerfreundlichere Anzeige. Es ist Ihre Präferenz, welche Methode Sie verwenden möchten und welche Ihrer Meinung nach in Zukunft wartungsfreundlicher ist.

AKTUALISIEREN (Code-Fix &Multi-Direction Spanning)
Ich wusste nicht, dass Ihre Tabelle in absteigender Reihenfolge erstellt wurde, also hatte ich den ustartlocation als "oberster Ort", der eine fehlerhafte Zeilen-/Zellenverschiebung verursachte. Ich habe den obigen Code korrigiert, um einen "Top-Standort" basierend auf ustartlocation richtig festzulegen und usize für jedes Gerät, das dieses Problem behebt.

Alternativ, da die Richtung wichtig sein kann oder nicht, habe ich die $devices angepasst -Befüllungsschleife (unten), um das Erstellen einer Zeilenspanne zu unterstützen, die entweder geht nach oben oder nach unten, ganz nach dem von Ihnen angegebenen Flag. Der einzige Code, den Sie ändern müssen (wenn Sie bereits die angepasste Anzeigeschleife von oben haben), wäre while Schleife, die $devices füllt :

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

Dieser neue Codeblock wird, wenn der usize mehr als 1 umfasst, bestimmen Sie die "oberste Zelle" und "unterste Zelle" für das aktuelle Gerät. Wenn Sie nach oben spannen , die oberste Zelle ist ustartlocation + usize - 1; wenn Sie nach unten spannen , es ist einfach ustartlocation . Auch die untere Position wird auf diese Weise bestimmt.