Op basis van uw vorige vraag, elke ustartlocation
is uniek (vandaar dat je het kunt gebruiken als index in je $devices
reeks). Met hetzelfde concept zou je de $devices
. kunnen invullen array van "ustartlocation
naar (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'];
}
}
Omdat je display-loop al door elke U
. gaat en geeft het toegewezen apparaat weer, u hoeft geen ander gedeelte te wijzigen. Het voorbehoud hierbij is echter dat de apparaatnaam herhaalt voor elke U
in plaats van span het. Om te overspannen is, zullen we wat meer werk moeten verzetten.
Om te beginnen zouden we gewoon de usize
. kunnen opslaan in de $devices
array in plaats van elke individuele positie in te vullen. Om later veel extra werk/berekeningen te voorkomen, slaan we ook een "placeholder"-apparaat op voor elke extra positie.
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';
}
}
Vervolgens controleert u in uw display-loop of de huidige positie een tijdelijke aanduiding is of niet (zo ja, toon dan gewoon de U
en niets doen voor het apparaat; als dit niet het geval is, geeft u het apparaat weer, of 'leeg'). Om het "span"-effect voor elk apparaat te bereiken, stellen we de rowspan
van de cel in gelijk aan de usize
. van het apparaat . Als het 1
is , het zal een enkele cel zijn; 2
, het zal 2 rijen beslaan, enz (dit is de reden waarom "niets doen" voor het apparaat op de tijdelijke aanduiding-rijen zal werken):
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>";
}
Dus, zoals te zien is - de eerste methode hierboven die het apparaat eenvoudig herhaalt voor elke U
het overspant is veel eenvoudiger. De tweede methode zal echter een gebruiksvriendelijker scherm opleveren. Het is uw voorkeur welke methode u wilt gebruiken en welke volgens u in de toekomst beter te onderhouden zal zijn.
UPDATE (code-fix &multi-direction spanning)
Ik wist niet dat je tabel in aflopende volgorde werd gebouwd, dus ik had de ustartlocation
als de "toplocatie" die een foutieve rij/celverschuiving veroorzaakte. Ik heb de bovenstaande code aangepast om een "toplocatie" correct in te stellen op basis van de ustartlocation
en usize
voor elk apparaat waarmee dat probleem wordt opgelost.
Als alternatief, omdat richting al dan niet belangrijk kan zijn, heb ik de $devices
. aangepast -vullus (hieronder) ter ondersteuning van het maken van een rij-span die ofwel . gaat naar boven of naar beneden, volledig afhankelijk van de vlag die u opgeeft. De enige code die je hoeft te veranderen (als je al de aangepaste weergave-loop van boven hebt) is de while
lus die $devices
vult :
$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';
}
}
}
Dit nieuwe codeblok zal, als de usize
overspant meer dan 1, bepaal de "bovenste cel" en "onderste cel" voor het huidige apparaat. Als u naar boven overspant , de bovenste cel is ustartlocation + usize - 1
; als je naar beneden overspant , het is gewoon ustartlocation
. Op deze manier wordt ook de bodemlocatie bepaald.