打印垂直排序的4列数组

时间:2012-11-17 12:13:16

标签: php sorting

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

enter image description here

这是要遵循的标记结构(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>";

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

2 个答案:

答案 0 :(得分: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标记或其他任何内容。

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

答案 1 :(得分:2)

尝试css3 multi column property

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