2

我需要打印一个包含 4 列菜单项的数组,垂直排序,并像这样填写:

在此处输入图像描述

这是要遵循的标记结构(5 项)。

<ul>
    <li>1</li>
    <li>2</li>
</ul>
<ul>
    <li>3</li>
</ul>
<ul>
    <li>4</li>
</ul>
<ul>
    <li>5</li>
</ul>

我一直在尝试这样的事情,但这不起作用,因为它没有首先填写行,如上例所示:

$cols = 4;
$cnt = count($items);

echo "<ul>";
foreach($items as $i => $item) {
     echo "<li>" . $item->ID . "</li>";
    if(($i + 1)%$cols == 0 && ($i + 1) != $cnt) {
        echo "</ul>\n<ul>";
    }
}
echo "</ul>";

对此的任何帮助表示赞赏!

4

2 回答 2

3

这样的事情应该可以解决您想做的事情。只需输入一个数据数组和所需的列数,它将将该数组分成指定的列数

<?php
    $items = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
    $numCols = 4;
    $result = ListArrayVals($items,$numCols);
    echo $result;
    function ListArrayVals($items,$numCols) {
        $minPerRow = floor(count($items)/$numCols);
        $remaining = count($items) % $numCols;
        $colCount = array();
        for ($i = 0;$i<$numCols;$i++) {
            if ($i < $remaining) {
                array_push($colCount,$minPerRow+1);
            } else {
                array_push($colCount,$minPerRow);
            }
        }
        $listString = '';
        $count = 0;
        for ($i = 0;$i<count($colCount);$i++) {
            $listString = $listString . "<ul>";
            for ($j = 0;$j<$colCount[$i];$j++) {
                $listString = $listString . '<li>' . $items[$count] . '</li>';
                $count = $count + 1;
            }
            $listString = $listString . '</ul>';
        }
        return $listString;
    }
?>

只需简单地更改 echo 语句以包装任何 HTML 标记或您想要的任何内容。

编辑我修好了。它现在适用于任意数量的列和输入数据。我还把它做成了一个函数,所以它可以重复使用很多次。

于 2012-11-17T12:44:16.623 回答
2

试试css3多列属性

<style>
.menu {
  -moz-column-count:4; /* Firefox */
  -webkit-column-count:4; /* Safari and Chrome */
  column-count:4;
}
</style>

<ul class="menu">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
</ul>
于 2012-11-17T15:33:58.427 回答