Na podstawie Twojego poprzedniego pytania, każda ustartlocation
jest unikalny (dlatego możesz użyć go jako indeksu w swoich $devices
szyk). Korzystając z tej samej koncepcji, możesz wypełnić $devices
tablica z „ustartlocation
do (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'];
}
}
Ponieważ twoja pętla wyświetlania już iteruje przez każde U
i wyświetla przypisane urządzenie, nie powinieneś potrzebować modyfikować żadnej innej części. Jednak zastrzeżenie polega na tym, że nazwa urządzenia powtarza się dla każdego U
zamiast span to. Do rozpiętości będziemy musieli wykonać trochę więcej pracy.
Na początek możemy po prostu zapisać usize
w $devices
tablicę zamiast wypełniać w poszczególnych pozycjach. Ponadto, aby zapobiec późniejszej dużej ilości dodatkowej pracy/obliczeń, przechowujemy również urządzenie „zastępcze” dla każdej dodatkowej pozycji.
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';
}
}
Następnie w pętli wyświetlania sprawdzisz, czy bieżąca pozycja jest symbolem zastępczym, czy nie (jeśli tak, po prostu wyświetl U
i nie rób nic dla urządzenia; jeśli nie, wyświetl urządzenie lub „puste”). Aby uzyskać efekt „span” dla każdego urządzenia, ustawimy rowspan
komórki równy usize
urządzenia . Jeśli to 1
, będzie to pojedyncza komórka; 2
, obejmie 2 rzędy itd. (dlatego zadziała "nic nie robienie" dla urządzenia w rzędach zastępczych):
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>";
}
Jak więc widać - pierwszy metoda powyżej, która po prostu powtarza urządzenie dla każdego U
rozpiętość jest znacznie prostsza. Jednak druga metoda zapewni bardziej przyjazny dla użytkownika wyświetlacz. To Twoja preferencja co do metody, której chcesz użyć i która Twoim zdaniem będzie łatwiejsza w utrzymaniu w przyszłości.
AKTUALIZUJ (code-fix &multi-direction spanning)
Nie zdawałem sobie sprawy, że twoja tabela była budowana w kolejności malejącej, więc miałem ustartlocation
jako „najwyższa lokalizacja”, która spowodowała błędne przesunięcie wiersza/komórki. Poprawiłem powyższy kod, aby poprawnie ustawić „najwyższą lokalizację” na podstawie ustartlocation
i usize
dla każdego urządzenia, które rozwiąże ten problem.
Alternatywnie, ponieważ kierunek może być ważny lub nie, dostosowałem $devices
-zapełnianie pętli (poniżej) do obsługi tworzenia rozpiętości wierszy, która idzie albo w górę lub w dół, całkowicie w zależności od wybranej flagi. Jedyny kod, który będziesz musiał zmienić (jeśli masz już dostosowaną pętlę wyświetlania z powyższej strony), to while
pętla wypełniająca $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';
}
}
}
Ten nowy blok kodu będzie, jeśli usize
obejmuje więcej niż 1, określ „górną komórkę” i „dolną komórkę” dla bieżącego urządzenia. Jeśli przechodzisz w górę , górna komórka to ustartlocation + usize - 1
; jeśli rozciągasz się w dół , to po prostu ustartlocation
. Dolna lokalizacja jest również określana w ten sposób.