【问题标题】:php foreach wrap every 2 divsphp foreach 每 2 个 div 换行一次
【发布时间】:2016-07-01 17:10:22
【问题描述】:

我需要为一个项目(一行)将每 2 个 div 与另一个 div 包装起来,所以它看起来像:

<div class="row">
  <div> Item </div>
  <div> Item </div>
</div>
<div class="row">
  <div> Item </div>
  <div> Item </div>
</div>

我尝试了一些解决方案,但它们不起作用,因为进来的物品是奇数(9 件物品)。这是我所拥有的:

<?php 
$count = 0;
foreach ($contents as $content) 
{
    //var_dump($content);
    $books      = $content["tags"];
    $book_image = $content['content_image'];
    $book_desc  = $content['content_social_description'];

    ++$count;

    if($count == 1)
    {  
        echo "<div class='et_pb_row'>";
    }

    foreach ($books as $book) 
    {
        $book_name      = $book['tag_name'];
        $book_name_trim = str_replace(' ', '-', $book_name);
        ?>
        <!-- Inside the Book Loop -->
        <div class='et_pb_column et_pb_column_1_2 books' style="background: url('https://s3-us-west-2.amazonaws.com/crowdhubproverbs31/<?php echo $book_image ;?>');">
            <h2><?php echo $book_name; ?></h2>
            <p><?php echo $book_desc; ?></p>
            <?php echo $count; ?>
        </div>

        <?php

    }

    if ($count == 2)
    {
        echo "</div>";
        $count = 0;
     }
}
?>

这有效,除了倒数第二行有 3 个项目,即使当我回显它时它显示“计数”为 2,所以它应该重置但不会。所以它:

<div class="row">
  <div> Item </div> "Count 1"
  <div> Item </div> "Count 2"
</div>
<div class="row">
  <div> Item </div> "Count 1"
  <div> Item </div> "Count 2"
</div>
<div class="row">
  <div> Item </div> "Count 1"
  <div> Item </div> "Count 2"
  <div> Item </div> "Count 2"
</div>
<div class="row">
  <div> Item </div> "Count 1"
  <div> Item </div> "Count 2"
</div>

【问题讨论】:

  • 您确定您有 3 件商品吗?在我看来,您的最后一项没有结束 div。由于它只有一个开头的 div,也许它看起来很奇怪。
  • 您正在主循环中操作 $count 变量,这意味着每 2 个 $content 项目将创建一个新行。如果 $content 中有 N $books,那么它将打印 N 次相同的 $count 值,并且不会创建新行。您是否有两本书的内容要打印 2 次?
  • 它工作正常,但第三行。所有行都正确关闭。前 2 行有 2 项,第 3 行有 3 项,第 4 行有 2 项。
  • 为什么不发布代码的实际输出而不是示例?比较代码和输出会容易得多..

标签: php foreach


【解决方案1】:

您应该在图书循环中打开和关闭您的 &lt;rows/&gt;,并为奇怪的图书添加延迟检查:

<?php 
$count = 0;
foreach ($contents as $content) 
{
    //var_dump($content);
    $books      = $content["tags"];
    $book_image = $content['content_image'];
    $book_desc  = $content['content_social_description'];


    foreach ($books as $book) 
    {
        ++$count;
        if($count == 1)
        {  
            echo "<div class='et_pb_row'>";
        }
        $book_name      = $book['tag_name'];
        $book_name_trim = str_replace(' ', '-', $book_name);
        ?>
        <!-- Inside the Book Loop -->
        <div class='et_pb_column et_pb_column_1_2 books' style="background: url('https://s3-us-west-2.amazonaws.com/crowdhubproverbs31/<?php echo $book_image ;?>');">
            <h2><?php echo $book_name; ?></h2>
            <p><?php echo $book_desc; ?></p>
            <?php echo $count; ?>
        </div>

        <?php
        if ($count == 2)
        {
            echo "</div>";
            $count = 0;
        }


    }
}

if ($count > 0)
{
    echo "</div>";
}
?>

这样做,您的 $count 变量将仅在运行 foreach($books AS $book) 循环时递增(因此您至少要打印一本书)

【讨论】:

    【解决方案2】:

    您可以利用array_chunk

    //First make a generator to get all books
    function allBooks($contents) {
        foreach($contents as $content) {    
            foreach($content['tags'] as $book) {
                yield $book; //Here you can yield whatever you want !
            }
        }
    }
    
    //Then create rows
    $itemPerRow = 2;
    $rows = array_chunk(iterator_to_array(allBooks($contents)), $itemPerRow, true);
    
    //Display all 
    foreach($rows as $row) {
       echo '<row>';
          foreach($row as $book) {
             //Display the book !
          }
       echo '</row>';
    }
    

    【讨论】:

    • 使用该代码,2 个 $books 数组,每个数组包含 5 个项目,将输出 6 个 &lt;row&gt; 而不仅仅是 5 个
    • 正常!!最后一行将有一个项目。这就是你的意思!!
    • 我明白你的意思我已经更新了代码;)。也许昂贵但优雅!
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 2018-02-16
    • 2012-08-15
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多