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í.