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.