Въз основа на предишния ви въпрос, всеки ustartlocation
е уникален (следователно защо можете да го използвате като индекс във вашите $devices
масив). Използвайки същата концепция, можете да попълните $devices
масив от „ustartlocation
до (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'];
}
}
Тъй като вашият дисплей-цикъл вече преминава през всеки U
и показва присвоеното устройство, не трябва да променяте друга част. Въпреки това, предупреждението за това е, че името на устройството ще повтаря за всеки U
вместо span то. За обхват това, ще трябва да свършим още малко работа.
Като начало можем просто да съхраним usize
в $devices
масив вместо попълване на всяка отделна позиция. Също така, за да предотвратим много допълнителна работа/изчисления по-късно, ние също така ще съхраняваме устройство „заместител“ за всяка допълнителна позиция.
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';
}
}
След това във вашия цикъл на показване ще проверите дали текущата позиция е контейнер или не (ако е така, просто покажете U
и не правете нищо за устройството; ако не е, покажете устройството или „празно“). За да постигнем ефекта "span" за всяко устройство, ще зададем rowspan
на клетката равна на usize
на устройството . Ако е 1
, ще бъде една клетка; 2
, ще обхване 2 реда и т.н. (ето защо „да не правите нищо“ за устройството в редовете-заместители ще работи):
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>";
}
И така, както се вижда -първи метод по-горе, който просто повтаря устройството за всеки U
обхваща се много по-просто. Вторият метод обаче ще представи по-удобен за потребителя дисплей. Ваше предпочитание е кой метод искате да използвате и кой смятате, че ще бъде по-поддържан в бъдеще.
АКТУАЛИЗАЦИЯ (коригиране на код и обхващане на множество посоки)
Не разбрах, че вашата таблица се изгражда в низходящ ред, така че имах ustartlocation
като "най-горното местоположение", което е причинило погрешно изместване на ред/клетка. Поправих кода по-горе, за да задам правилно „най-горно местоположение“ въз основа на ustartlocation
и usize
за всяко устройство, което ще реши този проблем.
Като алтернатива, тъй като посоката може или не може да е важна, персонализирах $devices
- цикъл за попълване (по-долу), за да поддържа създаването на обхват на ред, който върви или нагоре или надолу, напълно в зависимост от флага, който посочите. Единственият код, който трябва да промените (ако вече имате персонализирания цикъл на показване от по-горе), ще бъде while
цикъл, който попълва $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';
}
}
}
Този нов блок от код ще, ако usize
обхваща повече от 1, определя "горната клетка" и "долната клетка" за текущото устройство. Ако обхващате нагоре , най-горната клетка е ustartlocation + usize - 1
; ако обхващате надолу , това е просто ustartlocation
. Долното местоположение също се определя по този начин.