Baseret på dit tidligere spørgsmål, hver ustartlocation
er unik (derfor kan du bruge det som et indeks i dine $devices
array). Ved at bruge det samme koncept kan du udfylde $devices
array fra "ustartlocation
til (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'];
}
}
Fordi din display-loop allerede itererer gennem hver U
og viser den tildelte enhed, behøver du ikke at ændre nogen anden del. Advarslen til dette er dog, at enhedsnavnet vil gentages for hver U
i stedet for span det. Til span det, bliver vi nødt til at gøre lidt mere arbejde.
Til at starte med kunne vi bare gemme usize
i $devices
række i stedet for at udfylde hver enkelt position. For at forhindre en masse ekstra arbejde/beregninger senere, gemmer vi også en "pladsholder"-enhed for hver ekstra 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';
}
}
Dernæst vil du i din display-loop kontrollere, om den aktuelle position er en pladsholder eller ej (hvis det er tilfældet, skal du blot vise U
og ikke gør noget for enheden; hvis den ikke er det, skal du vise enheden eller 'tom'). For at opnå "span"-effekten for hver enhed, indstiller vi cellens rowspan
lig med enhedens usize
. Hvis det er 1
, vil det være en enkelt celle; 2
, det vil strække sig over 2 rækker osv. (det er derfor, at "intet gøre" for enheden på pladsholderrækkerne fungerer):
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>";
}
Så som det kan ses - den første metoden ovenfor, der blot gentager enheden for hver U
det spænder er meget enklere. Den anden metode vil dog præsentere en mere brugervenlig skærm. Det er din præference, hvilken metode du vil bruge, og hvilken du tror vil være mere vedligeholdelsesdygtig i fremtiden.
OPDATERING (kode-fix &multi-direction-spænder)
Jeg var ikke klar over, at din tabel blev bygget i faldende rækkefølge, så jeg havde ustartlocation
som "øverste placering", hvilket forårsagede et fejlagtigt række/celleskift. Jeg har rettet koden ovenfor for korrekt at indstille en "topplacering" baseret på ustartlocation
og usize
for hver enhed, der løser problemet.
Alternativt, da retningen måske eller måske ikke er vigtig, har jeg tilpasset $devices
-populating loop (nedenfor) for at understøtte oprettelse af en rækkevidde, der går enten opad eller nedad, helt afhængig af hvilket flag du angiver. Den eneste kode, du skal ændre (hvis du allerede har den tilpassede display-loop fra oven) ville være while
sløjfe, der udfylder $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';
}
}
}
Denne nye kodeblok vil, hvis usize
spænder over mere end 1, skal du bestemme "øverste celle" og "nederste celle" for den aktuelle enhed. Hvis du spænder opad , den øverste celle er ustartlocation + usize - 1
; hvis du spænder nedad , det er simpelthen ustartlocation
. Bundplaceringen bestemmes også på denne måde.