sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo completar las filas numeradas de la tabla HTML en función de si coinciden con el número de fila?

Según su pregunta anterior, cada ustartlocation es único (por eso puede usarlo como un índice en sus $devices formación). Usando este mismo concepto, podrías llenar los $devices matriz de "ustartlocation a (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'];
    }
}

Porque su bucle de visualización ya itera a través de cada U y muestra el dispositivo asignado, no debería necesitar modificar ninguna otra parte. Sin embargo, la advertencia de esto es que el nombre del dispositivo repetirá por cada U en lugar de span eso. Para abarcar tendremos que trabajar un poco más.

Para empezar, podríamos almacenar el usize en los $devices matriz en lugar de llenar cada posición individual. Además, para evitar mucho trabajo/cálculos adicionales más adelante, también almacenaremos un dispositivo de "marcador de posición" para cada posición adicional.

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';
    }
}

A continuación, en su ciclo de visualización, verificará si la posición actual es un marcador de posición o no (si es así, simplemente muestre la U y no haga nada por el dispositivo; si no es así, mostrar el dispositivo o 'vacío'). Para lograr el efecto de "span" para cada dispositivo, estableceremos el rowspan de la celda igual al usize del dispositivo . Si es 1 , será una sola celda; 2 , abarcará 2 filas, etc. (es por eso que "no hacer nada" para el dispositivo en las filas de marcadores de posición funcionará):

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>";
}

Entonces, como se puede ver, el primero método anterior que simplemente repite el dispositivo para cada U se extiende es mucho más simple. Sin embargo, el segundo método presentará una pantalla más fácil de usar. Es su preferencia el método que desea usar y cuál cree que será más fácil de mantener en el futuro.

ACTUALIZAR (corrección de código y expansión multidireccional)
No me di cuenta de que su tabla se estaba construyendo en orden descendente, así que tenía la ustartlocation como la "ubicación superior" que causó un cambio de fila/celda erróneo. He corregido el código anterior para establecer correctamente una "ubicación superior" basada en la ustartlocation y usize para cada dispositivo que solucionará ese problema.

Alternativamente, como la dirección puede o no ser importante, he personalizado los $devices -bucle de llenado (abajo) para admitir la creación de un intervalo de filas que vaya cualquiera hacia arriba o hacia abajo, dependiendo completamente de la bandera que especifique. El único código que deberá cambiar (si ya tiene el bucle de visualización personalizado de arriba) sería el while bucle que llena $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';
        }
    }
}

Este nuevo bloque de código, si usize abarca más de 1, determine la "celda superior" y la "celda inferior" para el dispositivo actual. Si está expandiendo hacia arriba , la celda superior es ustartlocation + usize - 1; si está expandiendo hacia abajo , es simplemente ustartlocation . La ubicación inferior también se determina de esta manera.