Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да попълня номерирани редове в HTML таблица въз основа на това дали съвпадат с номера на реда?

Въз основа на предишния ви въпрос, всеки ustartlocation е уникален (следователно защо можете да го използвате като индекс във вашите $devices масив). Използвайки същата концепция, можете да попълните $devices масив от „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'];
    }
}

Тъй като вашият дисплей-цикъл вече преминава през всеки U и показва присвоеното устройство, не трябва да променяте друга част. Въпреки това, предупреждението за това е, че името на устройството ще повтаря за всеки U вместо span то. За обхват това, ще трябва да свършим още малко работа.

Като начало можем просто да съхраним usize в $devices масив вместо попълване на всяка отделна позиция. Също така, за да предотвратим много допълнителна работа/изчисления по-късно, ние също така ще съхраняваме устройство „заместител“ за всяка допълнителна позиция.

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

След това във вашия цикъл на показване ще проверите дали текущата позиция е контейнер или не (ако е така, просто покажете U и не правете нищо за устройството; ако не е, покажете устройството или „празно“). За да постигнем ефекта "span" за всяко устройство, ще зададем rowspan на клетката равна на usize на устройството . Ако е 1 , ще бъде една клетка; 2 , ще обхване 2 реда и т.н. (ето защо „да не правите нищо“ за устройството в редовете-заместители ще работи):

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

И така, както се вижда -първи метод по-горе, който просто повтаря устройството за всеки U обхваща се много по-просто. Вторият метод обаче ще представи по-удобен за потребителя дисплей. Ваше предпочитание е кой метод искате да използвате и кой смятате, че ще бъде по-поддържан в бъдеще.

АКТУАЛИЗАЦИЯ (коригиране на код и обхващане на множество посоки)
Не разбрах, че вашата таблица се изгражда в низходящ ред, така че имах ustartlocation като "най-горното местоположение", което е причинило погрешно изместване на ред/клетка. Поправих кода по-горе, за да задам правилно „най-горно местоположение“ въз основа на ustartlocation и usize за всяко устройство, което ще реши този проблем.

Като алтернатива, тъй като посоката може или не може да е важна, персонализирах $devices - цикъл за попълване (по-долу), за да поддържа създаването на обхват на ред, който върви или нагоре или надолу, напълно в зависимост от флага, който посочите. Единственият код, който трябва да промените (ако вече имате персонализирания цикъл на показване от по-горе), ще бъде while цикъл, който попълва $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';
        }
    }
}

Този нов блок от код ще, ако usize обхваща повече от 1, определя "горната клетка" и "долната клетка" за текущото устройство. Ако обхващате нагоре , най-горната клетка е ustartlocation + usize - 1; ако обхващате надолу , това е просто ustartlocation . Долното местоположение също се определя по този начин.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. формата не работи с mysql

  2. Паралелни mysql заявки в php?

  3. Най-ефективният начин да направите SQL „INSERT IF NOT EXISTS“

  4. Подход на Ajax за попълване на второ динамично падащо меню въз основа на избора в първия

  5. Как да кодирам (utf8mb4) в Python