2012-12-09 21 views
5

W przeciągu kilku godzin, byłem bezskutecznie próbuje dowiedzieć się kod php, aby wyświetlić listę w trzech kolumnach tak, że ma ten rozkazJak wyświetlić listę w trzech kolumnach za pomocą php?

A D G 
B E H 
C F I 

ale jestem naprawdę utracone. Czy ktoś może mi w tym pomóc? Obecnie tylko kod, który wymienia w tej kolejności

A B C 
D E F 
G H I 

To jest mój bieżący kod:

echo '<table><tr>'; 
foreach ($categories as $k => $category) { 
    if ($k % 3 == 0 && $k ! = 0) { 
     echo '</tr><tr>'; 
    } 
    echo '<td><a href="category.php?category='.$category["id"].'">'.$category["category"].'</a></td>'; 
} 
echo '</table>'; 
+0

Czy to zawsze będą używane liczby? –

+0

Właściwie w użyciu będą to tylko litery. –

+0

Sprawdź [stackoverflow.com/questions/6938094/data-from-database-with-foreach-from-top-to-down # 6938762] (http://stackoverflow.com/questions/6938094/data-from-database-with-foreach-from -top-to-down # 6938762). – Sean

Odpowiedz

4

Spróbuj tego:

$columns = 3; 
$rows = ceil(count($categories)/$columns); 

echo '<table>'; 

for ($row = 0; $row < $rows; $row++) { 
    echo '<tr>'; 

    foreach ($categories as $k => $category) { 
     if ($k % $rows == $row) { 
      echo '<td><a href="category.php?category='.$category["id"].'">'.$category["category"].'</a></td>'; 
     } 
    } 

    echo '</tr>'; 
} 

echo '</table>'; 

To nie jest bardzo wydajny, ale teraz ja nie mogę wymyślić lepszego sposobu na zrobienie tego.

+0

Wielkie dzięki! Działa to świetnie! Mój zbiór danych nie jest tak duży, więc powinien być dobry. –

4

Jeśli chcesz mieć listę świadczonych w kolumnach, jak wskazano, można generować je w logicznej kolejności i po prostu używa CSS columns właściwość, aby ustawić w kolumnach:

ul { 
    -moz-column-count: 2; 
    -webkit-column-count: 2; 
    column-count: 2; 
} 

Złą wiadomością jest to, że nie jest to obsługiwane przez IE 9 i wcześniejsze, ale kolumny polyfills, takie jak css3-multi-column.js, mogą działać wystarczająco dobrze w prostych przypadkach (pomimo ich ograniczeń i problemów).

3

miałem ten sam problem, a ja jestem delegowania moją odpowiedź na to stare pytanie z następujących powodów:

  1. Moja odpowiedź jest bardziej ogólne i łatwe dla innych, aby dostosować.
  2. Moja tablica była asocjatywna, z kluczem ciąg. BTW, moja odpowiedź będzie działać zarówno dla tablic asocjacyjnych, jak i indeksowanych.
  3. Nie chciałem skomplikowanego rozwiązania CSS, jak niektóre inne odpowiedzi na ten temat. Właściwie to rozwiązanie, które wymyśliłem, było całkiem proste - użyj wielu tagów ze stylem = "float: left", wewnątrz ogromnego stołu. Chociaż byłem sceptyczny, że posiadanie wielu znaczników tbody w jednej tabeli przejdzie sprawdzanie poprawności HTML, w rzeczywistości przeszło bezbłędnie.

Niektóre rzeczy do uwaga:

  • $ numCols jest żądana liczba kolumn.
  • Ponieważ jesteśmy pływającymi przedmiotami, może być konieczne ustawienie szerokości i minimalnej szerokości elementów rodzica i/lub dodanie pewnego stylu < br style = "clear: both"/>, w zależności od sytuacji.
  • alternatywnych metod sortowania, zobacz http://php.net/manual/en/array.sorting.php

Oto moja pełna odpowiedź:

function sortVertically($data = array()) 
{ 
    /* PREPARE data for printing */ 
    ksort($data);  // Sort array by key. 
    $numCols = 3; // Desired number of columns 
    $numCells = is_array($data) ? count($data) : 1 ; 
    $numRows = ceil($numCells/$numCols); 
    $extraCells = $numCells % $numCols; // Store num of tbody's with extra cell 
    $i   = 0; // iterator 
    $cCell  = 0; // num of Cells printed 
    $output  = NULL; // initialize 


    /* START table printing */ 
    $output  .= '<div>'; 
    $output  .= '<table>'; 

    foreach($data as $key => $value) 
    { 
     if($i % $numRows === 0) // Start a new tbody 
     { 
      if($i !== 0)   // Close prev tbody 
      { 
       $extraCells--; 
       if ($extraCells === 0) 
       { 
        $numRows--;  // No more tbody's with an extra cell 
        $extraCells--; // Avoid re-reducing numRows 
       } 
       $output .= '</tbody>'; 
      } 

      $output .= '<tbody style="float: left;">'; 
      $i = 0;     // Reset iterator to 0 
     } 
     $output .= '<tr>'; 
      $output .= '<th>'.$key.'</th>'; 
      $output .= '<td>'.$value.'</td>'; 
     $output .= '</tr>'; 

     $cCell++;     // increase cells printed count 
     if($cCell == $numCells){ // last cell, close tbody 
      $output .= '</tbody>'; 
     } 

     $i++; 
    } 

    $output .= '</table>'; 
    $output .= '</div>'; 
    return $output; 
} 

Mam nadzieję, że ta odpowiedź jest przydatna.