如何使用PHP在三列中显示列表?

时间:2012-12-09 02:37:55

标签: php html html-table

在过去的几个小时里,我一直试图弄清楚PHP代码在三列中显示一个列表,以便它有这个订单

A D G
B E H
C F I

但我真的迷路了。谁能帮我这个? 我目前只有按此顺序列出的代码

A B C
D E F
G H I

这是我目前的代码:

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

3 个答案:

答案 0 :(得分:5)

试试这个:

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

效率不高,但现在我无法想出更好的做法。

答案 1 :(得分:5)

如果您希望列表中的呈现列表,您可以按逻辑顺序生成它,并使用CSS columns属性设置列:

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

坏消息是IE 9及更早版本不支持此功能,但像css3-multi-column.js这样的Columns polyfills在简单的情况下可能运行得很好(尽管它们有局限性和问题)。

答案 2 :(得分:3)

我有同样的问题,我发布了这个旧问题的答案,原因如下:

  1. 我的回答更为一般,也很容易让其他人适应。
  2. 我的数组是关联的,带有字符串键。顺便说一下,我的答案适用于关联数组和索引数组。
  3. 我不想要一个复杂的CSS解决方案,就像这个主题的其他一些答案一样。实际上,我提出的解决方案非常简单 - 使用style =&#34; float:left&#34;的多个标签,在一个巨大的桌子里面。虽然我怀疑在一个表中有多个tbody标签会通过HTML验证,但实际上确实没有错误。
  4. 有些注意事项:

    • $ numCols 是您想要的列数。
    • 由于我们是浮动项目,您可能需要设置父元素的宽度和最小宽度和/或添加一些&lt; br style =&#34; clear:both&#34; /&gt;,根据您的情况。
    • 有关其他排序方法,请参阅http://php.net/manual/en/array.sorting.php

    以下是我的完整答案:

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

    我希望你觉得这个答案很有用。