D'après votre question précédente, chaque ustartlocation
est unique (c'est pourquoi vous pouvez l'utiliser comme index dans votre $devices
déployer). En utilisant ce même concept, vous pouvez remplir le champ $devices
tableau de "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'];
}
}
Parce que votre boucle d'affichage parcourt déjà chaque U
et affiche l'appareil attribué, vous ne devriez pas avoir besoin de modifier toute autre partie. Cependant, la mise en garde est que le nom de l'appareil va se répéter pour chaque U
au lieu de span ce. Pour s'étendre il, nous devrons faire un peu plus de travail.
Pour commencer, nous pourrions simplement stocker le usize
dans le $devices
tableau au lieu de remplir chaque position individuelle. De plus, pour éviter beaucoup de travail/calculs supplémentaires par la suite, nous stockerons également un dispositif "d'espace réservé" pour chaque position supplémentaire.
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';
}
}
Ensuite, dans votre boucle d'affichage, vous vérifierez si la position actuelle est un espace réservé ou non (si c'est le cas, affichez simplement le U
et ne rien faire pour l'appareil ; si ce n'est pas le cas, affichez l'appareil ou "vide"). Pour obtenir l'effet "span" pour chaque appareil, nous allons définir le rowspan
de la cellule égal à la usize
de l'appareil . Si c'est 1
, ce sera une seule cellule ; 2
, il s'étendra sur 2 lignes, etc. (c'est pourquoi "ne rien faire" pour l'appareil sur les lignes d'espace réservé fonctionnera) :
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>";
}
Donc, comme on peut le voir - le premier méthode ci-dessus qui répète simplement le périphérique pour chaque U
il s'étend est beaucoup plus simple. Cependant, la deuxième méthode présentera un affichage plus convivial. C'est votre préférence pour la méthode que vous souhaitez utiliser et celle qui, selon vous, sera la plus maintenable à l'avenir.
MISE À JOUR (code-fix &multi-direction spanning)
Je n'avais pas réalisé que votre table était construite dans l'ordre décroissant, j'avais donc le ustartlocation
comme "l'emplacement supérieur" qui a provoqué un décalage de ligne/cellule erroné. J'ai corrigé le code ci-dessus pour définir correctement un "emplacement supérieur" basé sur le ustartlocation
et usize
pour chaque appareil qui résoudra ce problème.
Alternativement, comme la direction peut ou non être importante, j'ai personnalisé le $devices
-boucle de remplissage (ci-dessous) pour prendre en charge la création d'une étendue de ligne qui va soit vers le haut ou vers le bas, complètement selon le drapeau que vous spécifiez. Le seul code que vous aurez besoin de changer (si vous avez déjà la boucle d'affichage personnalisée ci-dessus) serait le while
boucle qui remplit $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';
}
}
}
Ce nouveau bloc de code sera, si le usize
s'étend sur plus de 1, déterminez la "cellule du haut" et la "cellule du bas" pour l'appareil actuel. Si vous vous étendez vers le haut , la cellule du haut est ustartlocation + usize - 1
; si vous vous étendez vers le bas , c'est simplement ustartlocation
. L'emplacement du bas est également déterminé de cette manière.