在来自foreach循环php的10个值之后中断并创建新的<ul> </ul>

时间:2014-03-07 22:07:27

标签: php foreach

如果值超过5,我希望创建一个带有来自foreach循环的li内容的2个或更多ul类。

$data = array('Barcelona','Jujuy','Cordoba','Mendoza','Galicia','Madrid','Estonia','New York');

echo '<ul class="row1">';
foreach($data as $value){

   echo '<li>' . $value . '</li>';

}
echo '</ul>'

结果将是:

<ul class="row1">
  <li>Barcelona</li>
  ...
  ...
</ul>

我想要的是在5个城镇之后创建一个像

这样的新ul类
<ul class="row1">
  <li>Barcelona</li>
  ...
  ...
  ...
  ...
</ul>

<ul class="row2">
  <li>Madrid</li>
  ...
  ...
  ...
  ...
</ul>

有办法做到这一点吗?

感谢任何帮助。

5 个答案:

答案 0 :(得分:6)

<?php
$data = array('Barcelona','Jujuy','Cordoba','Mendoza','Galicia','Madrid','Estonia','New York');

$cur = 0;
$rowNum = 1;
foreach($data as $value){
    if($cur == 0)
    {
        echo '<ul class="row' . $rowNum . '">';
    }
    echo '    <li>' . $value . '</li>';
    if($cur == 4)
    {
        echo '</ul>';
        $cur = 0;
        $rowNum++;
    }
    else
    {
        $cur++;
    }
}
?>

答案 1 :(得分:2)

保持简单。 array_chunk()功能听起来正是您正在寻找的。

在此示例中,每个列表中将有3个项目。

$lists  = array_chunk($data, 3);
$number = 1;
foreach ($lists as $items) {
    echo '<ul class="row', $number++, '">';
    foreach ($items as $item) {
        echo '<li>', $item, '</li>';
    }
    echo '</ul>';
}

你也可以做一些手术(这可能会消耗相当多的内存)。如果您知道自己拥有的项目数量A以及列表中应包含的项目数B,那么您可以计算出需要的列表数量ceil(A / B):< / p>

$itemsCount   = count($data);
$itemsPerList = 3;
$listsNeeded  = ceil($itemsCount / $itemsPerList);

for ($i = 0; $i < $listsNeeded; $i++) {
    echo '<ul class="row', ($i + 1), '">';
    for ($j = 0; $j < $itemsPerList; $j++) {
        $index = (($i * $itemsPerList) + $j);
        if (isset($data[$index])) {
            echo '<li>', $data[$index], '</li>';
        } else {
            break;
        }
    }
    echo '</ul>';
}

答案 2 :(得分:0)

你可以通过计算你已经完成的数量来做到这一点。这可以通过获取变量并在foreach()内增加变量或直接使用for()来实现。

$amount = count($data);
$no_of_ul = 1;
for ($i=0; $i<$amount; $i++) {
    if ($i % 5 == 0) {
        if ($i > 0) {
            echo '</ul>';
        }
        echo '<ul class="row'.$no_of_ul.'">';
        $no_of_ul++;
    }
    echo '<li>'.$data[$i].'</li>';
}

$i % 5 == 0表示“如果$i除以5,其余为0”,$i = 0, 5, 10, ...为真。有了这个,您只需要手动关闭最后一个<ul>

答案 3 :(得分:0)

有帮助吗?

$data = array('Barcelona','Jujuy','Cordoba','Mendoza','Galicia','Madrid','Estonia','New York');
$count = 1 ;
$len = sizeof($data);
$row = 1;
foreach($data as $value){
   if($count == 1 ){
    echo '<ul class="row'.$row.'">';
    $row++;
   }
   echo '<li>' . $value . '</li>';
   if($count !=1 && $count%5 == 0){
    echo '</ul>';
    if($len-1 != $count){
        echo '<ul class="row'.$row.'">';
        $row++;
    }
   }
   $count++;

}

答案 4 :(得分:0)

我知道这是一篇较旧的文章,但我认为我会有所贡献。我有一个wp项目,我不得不在整个网站上显示很多标题/永久链接列表。

Sverri M. Olsen的回答确实使这项工作变得更快,更容易阅读并且通用...

function display_title_link_lists($args, $chunk_size) {
$query = new WP_Query( $args );
$title_link = [];

while ( $query->have_posts() ) : $query->the_post();
    $title_link[get_the_title()] = get_the_permalink();
endwhile;

$output_title_link = array_chunk($title_link, $chunk_size, true);
foreach ($output_title_link as $tierOne) {
    echo "<div class='col-sm col-md'><ul>";
    foreach($tierOne as $key => $value) {
        echo "<li><a href='$value'>$key</a></li>";
    }
    echo "</ul></div>";
}

wp_reset_postdata();

我能够对其进行修改,并将其用作其他项目中的另一个实用程序。