7

在过去的几个小时里,我一直没有成功地试图找出 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>';
4

3 回答 3

6

尝试这个:

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

这不是很有效,但现在我想不出更好的方法。

于 2012-12-09T03:38:14.960 回答
5

如果您希望按照指示在列中呈现列表,您可以按逻辑顺序生成它,并仅使用 CSScolumns属性在列中进行设置:

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

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

于 2012-12-09T09:30:18.153 回答
3

我遇到了同样的问题,出于以下原因,我发布了对这个老问题的回答:

  1. 我的回答更笼统,更容易让其他人适应。
  2. 我的数组是关联的,带有一个字符串键。顺便说一句,我的答案适用于关联数组和索引数组。
  3. 我不想要一个复杂的 CSS 解决方案,就像这个主题的其他一些答案一样。实际上,我想出的解决方案非常简单——在一张巨大的桌子内使用多个 style="float:left" 的标签。虽然我怀疑在单个表中包含多个 tbody 标记是否会通过 HTML 验证,但实际上它确实通过且没有错误。

需要注意的一些事项:

  • $numCols是您想要的列数。
  • 由于我们是浮动项目,您可能需要根据您的情况设置父元素的宽度和最小宽度和/或添加一些 <br style="clear: both" />。
  • 有关替代排序方法,请参阅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;
}

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

于 2014-03-12T03:03:24.623 回答