Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę wypełnić ponumerowane wiersze tabeli HTML na podstawie tego, czy pasują do numeru wiersza?

Na podstawie Twojego poprzedniego pytania, każda ustartlocation jest unikalny (dlatego możesz użyć go jako indeksu w swoich $devices szyk). Korzystając z tej samej koncepcji, możesz wypełnić $devices tablica z „ustartlocation do (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'];
    }
}

Ponieważ twoja pętla wyświetlania już iteruje przez każde U i wyświetla przypisane urządzenie, nie powinieneś potrzebować modyfikować żadnej innej części. Jednak zastrzeżenie polega na tym, że nazwa urządzenia powtarza się dla każdego U zamiast span to. Do rozpiętości będziemy musieli wykonać trochę więcej pracy.

Na początek możemy po prostu zapisać usize w $devices tablicę zamiast wypełniać w poszczególnych pozycjach. Ponadto, aby zapobiec późniejszej dużej ilości dodatkowej pracy/obliczeń, przechowujemy również urządzenie „zastępcze” dla każdej dodatkowej pozycji.

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

Następnie w pętli wyświetlania sprawdzisz, czy bieżąca pozycja jest symbolem zastępczym, czy nie (jeśli tak, po prostu wyświetl U i nie rób nic dla urządzenia; jeśli nie, wyświetl urządzenie lub „puste”). Aby uzyskać efekt „span” dla każdego urządzenia, ustawimy rowspan komórki równy usize urządzenia . Jeśli to 1 , będzie to pojedyncza komórka; 2 , obejmie 2 rzędy itd. (dlatego zadziała "nic nie robienie" dla urządzenia w rzędach zastępczych):

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

Jak więc widać - pierwszy metoda powyżej, która po prostu powtarza urządzenie dla każdego U rozpiętość jest znacznie prostsza. Jednak druga metoda zapewni bardziej przyjazny dla użytkownika wyświetlacz. To Twoja preferencja co do metody, której chcesz użyć i która Twoim zdaniem będzie łatwiejsza w utrzymaniu w przyszłości.

AKTUALIZUJ (code-fix &multi-direction spanning)
Nie zdawałem sobie sprawy, że twoja tabela była budowana w kolejności malejącej, więc miałem ustartlocation jako „najwyższa lokalizacja”, która spowodowała błędne przesunięcie wiersza/komórki. Poprawiłem powyższy kod, aby poprawnie ustawić „najwyższą lokalizację” na podstawie ustartlocation i usize dla każdego urządzenia, które rozwiąże ten problem.

Alternatywnie, ponieważ kierunek może być ważny lub nie, dostosowałem $devices -zapełnianie pętli (poniżej) do obsługi tworzenia rozpiętości wierszy, która idzie albo w górę lub w dół, całkowicie w zależności od wybranej flagi. Jedyny kod, który będziesz musiał zmienić (jeśli masz już dostosowaną pętlę wyświetlania z powyższej strony), to while pętla wypełniająca $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';
        }
    }
}

Ten nowy blok kodu będzie, jeśli usize obejmuje więcej niż 1, określ „górną komórkę” i „dolną komórkę” dla bieżącego urządzenia. Jeśli przechodzisz w górę , górna komórka to ustartlocation + usize - 1; jeśli rozciągasz się w dół , to po prostu ustartlocation . Dolna lokalizacja jest również określana w ten sposób.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd 1038 Brak pamięci sortowania, rozważ zwiększenie rozmiaru bufora sortowania

  2. Pobieranie ostatniej notatki (według sygnatury czasowej) w pojedynczym zapytaniu z tabeli 1:n

  3. MySQL:UNIKALNE ograniczenie bez indeksu

  4. Jak mogę policzyć liczbę postów?

  5. Narzędzie do tworzenia diagramów ER typu open source dla mysql