每四个div包裹一个div

时间:2014-08-02 10:14:04

标签: php opencart

我需要一些关于OpenCart的php循环的帮助。

我需要做的是每4个循环包围一个div输出数据。

我有以下

<?php foreach ($categories as $category) { ?>
<div class="col-lg-3 col-md-3">.....</div>
<?php } ?>

我明白

<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>

但我希望得到的是

<div class="row">
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
</div>
<div class="row">
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>
</div>
<div class="row">
<div class="col-lg-3 col-md-3">.....</div>
<div class="col-lg-3 col-md-3">.....</div>    
</div>

非常感谢任何帮助:)

9 个答案:

答案 0 :(得分:7)

试试这个

<?php 
$i=0;
$wrap_count = 4; // you can change this no of divs to wrap
foreach ($categories as $category) 
{ 
    $i+=1;
    if($i%$wrap_count==1)
    {
        echo '<div class="row">';
    }
?>
    <div class="col-lg-3 col-md-3">.....</div>
<?php 
    if($i%$wrap_count==0)
    {
        echo '</div>';
    }
} 

if($i%$wrap_count!=0)
{
    echo '</div>';
}
?>

答案 1 :(得分:4)

<?php

$i = 0;
foreach ($categories as $category) {

  if (($i % 4) === 0) {
    echo "<div class='row'>";
  }

  echo '<div class="col-lg-3 col-md-3"></div>';

  if (($i % 4) === 3) {
    echo "</div>";
  }

  $i++;
}

?>

Ps,如果$categories是非键控数组,即array('a', 'b', 'c'),那么您可以删除i = 0;i++;并将foreach更改为foreach ($categories as $i => $category) { }


正如评论中提到的zerkms,这里的魔法来自% (Modulo operation),它基本上就像一个时钟 - 数字将从0向上递增,直到它们达到12,此时它被重置为0再次。所以时钟据说是模12。在这个例子中,我们使用模4来循环打印我们的开始和结束行元素。

模4是序列0, 1, 2, 3, 0, 1, 2, 3, 0, 1, etc

答案 2 :(得分:3)

试试这个: -

<div class="row">
    <?php
    $i = 1;
   foreach ($categories as $category) { ?>

      <div class="col-lg-3 col-md-3">.....</div>

    <?php if ($i % 4 == 0){ ?>
    </div><div class="row">
    <?php } ?>
    <?php $i++; ?>
    <?php } ?>

答案 3 :(得分:1)

您可以使用计数器变量。最初将其设置为等于0.然后对于每个循环检查其值。如果它等于0,则输出<div class="row">并将1加到变量的值上。如果其值> 0和&lt; 5然后输出<div class="col-lg-3 col-md-3">.....</div>并为其添加1的值。如果它等于5输出</div>并将计数器变量重置为0。

类似(代码测试):

<?php
    $counter = 0;
    foreach ($categories as $category) {
                If ($counter == 0) {
                    echo '<div class="row">
<div class="col-lg-3 col-md-3">.....</div>
';
    $counter++;
                } elseif ($counter > 0 && $counter < 3) {
                    echo '<div class="col-lg-3 col-md-3">.....</div>
';
    $counter++;
                } elseif ($counter == 3) {
                    echo '<div class="col-lg-3 col-md-3">.....</div>
</div>
';
                    $counter = 0;
                }
    }
    if ($counter > 0) {
                echo '</div>
';
    }
?>

答案 4 :(得分:1)

模拟运算符在与行中您想要的项目数进行比较时使用等于零。因此,您可以在那里输出您的起始<div>

要添加结束div,您需要检查4的模数是否等于3,或者我们是否已达到项目总数,以防止错过关闭</div>

<?php 

    // set a counter
    $rowCount = 0;

    // store the total number of categories minus 1 as we will be
    // counting from 0 with the counter

    $categoryTotal = count($categories) - 1;

    foreach($categories as $c){

        if($rowCount % 4 == 0){
            echo '<div class="row">';
        }?>

        <div class="col-lg-3 col-md-3""></div>

        <?php 

        // add your closing div if it is the end of a row or if there are no more items    

        if($rowCount % 4 == 3 || $rowCount == $categoryTotal){
            echo '</div>';
        }

        // increment your counter
        $rowCount++;

    } ?>

答案 5 :(得分:0)

好吧,将其添加到您的代码中:

//before foreach
$i = 0;

//在关闭前的foreach内部}

$i++;
}//this closes the foreach

然后在添加任何div之前(可能在foreach的开头:

if($i % 4 == 0)
{
 echo "<div class='each-four-iterations'>";
}

在$ i ++语句之前,添加:

if($i % 4 == 0)
{
 echo "</div>";
}

答案 6 :(得分:0)

<?php
$wrap_count = 2; // you can change this no of divs to wrap
foreach ($categories as $category) :
$i+=1;
if($i%$wrap_count==1):
echo '<div class="row">';
endif;?>
<div class="col-lg-3 col-md-3">.....</div>
if($i%$wrap_count==0) : echo '</div>'; endif; endforeach;
?>

适合我的工作

答案 7 :(得分:0)

我有一个替代选项可能会有效,具体取决于您的数组。

$new_array = array_chunk($your_array, 4);

foreach($new_array as $group_of_$four){
  echo '<div class="row">';
  foreach($group_of_four as $one){
     // Single Item
  }
  echo '</div>';
}

答案 8 :(得分:0)

试试这个。它对我有用。

<?php $count = 1; ?>
                <?php foreach ($model->userProfile->portfolio as $item): ?>
                    <?php if ($count % 4 == 1): ?>
                        <div class="row" style="margin-bottom: 30px;">
                    <?php endif ?>

                        <div class="col-md-3">

                        </div>

                    <?php if ($count % 4 == 0): ?>

                        </div>

                    <?php endif ?>

                    <?php  $count++ ?>
                <?php endforeach ?>