Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je remplir les lignes numérotées du tableau HTML en fonction de leur correspondance avec le numéro de ligne ?

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.