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

Jak połączyć wiersz tabeli z tablicą PHP?

Do przetwarzania zagnieżdżonych pętli używam techniki „czytaj z wyprzedzeniem”. Oznacza to, że pętle „foreach” nie mogą być używane, ponieważ następny rekord musi zostać odczytany zaraz po przetworzeniu bieżącego. Zasadniczo ostatnią akcją, którą wykonujesz w pętli, jest odczytanie następnego rekordu, gdy konfigurujesz go do następnej iteracji. Zauważ, że nigdy nie sprawdzasz, kiedy drukować rekord, ponieważ decyduje o tym struktura grup. Pętle kodu są takie same jak struktura grup w danych

„Grupa” to wszystkie rekordy o tym samym identyfikatorze .

Zakładam, że „treść” i „akt” są identyczne dla każdego wpisu w grupie.

Edytowano w celu dodania atrybutów „rowspan” do odpowiednich tagów „td”. Podejrzewam, że css może być w tym momencie łatwiejsze.

Problem polega na tym, że grupa nie może zostać wyświetlona, ​​dopóki nie wiadomo, ile wpisów się w niej znajduje.

Tak więc "buforuję" wszystkie rekordy należące do grupy w tablicy. na końcu grupy jest wyświetlany z odpowiednimi atrybutami 'rowspan' w html.

Jest testowany na PHP 5.3.18. Zawiera dane testowe.

<?php /* Q24028866 */
$testData = array(array('id' => 2, 'date' => '05/13/2014', 'content' => 'some contents 2', 'act' => 'act1 act2 act3'),
                  array('id' => 2, 'date' => '05/28/2014', 'content' => 'some contents 2',  'act' => 'act1 act2 act3'),
                  array('id' => 7, 'date' => '06/04/2014', 'content' => 'some contents 7',  'act' => 'act1 act2 act3'),
                  array('id' => 8, 'date' => '06/08/2014', 'content' => 'some contents 8',  'act' => 'act1 act2 act3'),
                  array('id' => 8, 'date' => '06/09/2014', 'content' => 'some contents 8',  'act' => 'act1 act2 act3'));
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<table border='1'>
<thead><th>Date</th><th>Content</th><th>Act</th></thead>
<?php
// use 'read ahead' so there is always a 'previous' record to compare against...
$iterContents = new \ArrayIterator($testData);
$curEntry = $iterContents->current();

while ($iterContents->valid()) { // there are entries to process

    $curId = $curEntry['id'];

    // buffer the group to find out how many entries it has...
    $buffer = array();
    $buffer[] = $curEntry;

    $iterContents->next(); // next entry - may be same or different id...
    $curEntry = $iterContents->current();

    while ($iterContents->valid() && $curEntry['id'] == $curId) {  // process the group...
        $buffer[] = $curEntry; // store all records for a group in the buffer

        $iterContents->next(); // next entry - may be same or different id...
        $curEntry = $iterContents->current();
    }

     // display the current group in the buffer...
     echo '<tr>';
     echo '<td>', $buffer[0]['date'], '</td>';
     $rowspan = count($buffer) > 1 ? ' rowspan="'. count($buffer) .'"' : '';
     echo '<td', $rowspan, '>', $buffer[0]['content'], '</td>',
           '<td', $rowspan, '>', $buffer[0]['act'], '</td>';
     echo '</tr>';
     for($i = 1; $i < count($buffer); $i++) {
          echo '<tr><td>', $buffer[$i]['date'], '</td>';
          echo '</tr>';
     }
} ?>
</table>
</body>
</html>


  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 podczas instalacji — inicjalizacja bazy danych nie powiodła się

  2. Jak za pomocą mysqli napisać bezpieczne zapytanie SELECT, które ma zmienną liczbę wartości podanych przez użytkownika?

  3. Znajdź kolumnę zawierającą podaną wartość w MySQL

  4. MySQL 1062 - Zduplikowany wpis '0' dla klucza 'PRIMARY'

  5. Pharo Smalltalk i mySql