7

過去数時間、私はphpコードを理解して、この順序になるように3列のリストを表示しようとして失敗しました。

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ポリフィルは、単純なケースでは十分に機能する可能性があります(制限や問題はありますが)。

于 2012-12-09T09:30:18.153 に答える
3

これと同じ問題が発生しました。次の理由で、この古い質問に対する回答を投稿しています。

  1. 私の答えはもっと一般的で、他の人が適応しやすいです。
  2. 私の配列は、文字列キーを使用して関連付けられていました。ところで、私の答えは、連想配列とインデックス付き配列の両方で機能します。
  3. このトピックに関する他の回答のように、複雑なCSSソリューションは必要ありませんでした。実際、私が思いついた解決策は非常に単純でした。巨大なテーブルの中で、style = "float:left"を使用して複数のタグを使用します。1つのテーブルに複数の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 に答える