PHP中的foreach循环中如何使用break和continue?

5

我遇到了一个问题。我在PHP中建立了一个foreach循环:

 <?php $show = false; ?>
 <?php foreach ($this->items as $item) : ?>

但我想要回显前20个项目,并继续后面的16个项目。

我已经成功做到在20个项目后进行分页,但我无法获取接下来的16个项目(从第21个开始)。

这是我目前的代码:

<?php $show = false; ?>
<?php $i = $item->id = 1; ?>
<?php foreach ($this->items as $item) : ?>
<?php if(++$i > 20) break; ?>

如果我将$i设置为'21',它仍然会输出项目1等等。

解决方案 ## 感谢@dhavald

<?php $show = false; ?>                                   
<?php foreach (array_slice ($this->items, 0, 20) as $item) : ?>

通过在foreach中放置一个array_slice,您可以控制要显示的项目。因此,在下一个div中,我想显示第21到36项,我唯一需要改变的是0和20为20, 36。
为了澄清我的意思,我有三个div,我想在上面输出一些项目。如果用户折叠第一个div,将出现前20个项目,如果用户单击div2,则会出现接下来的16个项目。
我该如何更正此代码以实现这一点?
由于我忘记提到,您提供的解决方案确实帮助我理解了过程,但由于我使用了Joomla 3.1的组件生成器,所以有一行代码使得调用前20个和第二个16个项目变得有点复杂。
在foreach循环之后直接有这行代码。
if($item->state == 1 || ($item->state == 0 && JFactory::getUser()>authorise('core.edit.own',' com_ncitycatemus.vraagantwoordtoevoegen.'.$item->id))):

$show = true;

我该如何使用循环来管理它?或者您建议采用其他方式吗?

提前感谢!真的帮助我理解了循环!!

6个回答

9

break用于跳出循环并停止执行,continue用于跳过循环中的其余代码,并跳到下一次迭代。

在我看来,使用breakcontinue是错误的方法。我会简单地使用两个for循环:

$keys = array_keys($this->items);
$keysLength = count($keys);

echo '<div id="div1">';
for ($i = 0; $i < min($keysLength, 20); $i++) {
    echo $this->items[$keys[$i]];
}
echo '</div>';

if ($keysLength >= 20) {
    echo '<div id="div2">';
    for ($i = 20; $i < min($keysLength, 36); $i++) { //36 being 20 + 16
        echo $this->items[$keys[$i]];
    }
    echo '</div>';
}

注意: 这将适用于 $this->items 中的任何数量。 如果它在20以下,它将简单地跳过接下来的16个,如果它在36以上,它将简单地忽略剩余的。


+1 用于检查 $this->items 的实际长度。我太懒了 :D - gkalpak
谢谢!它提供了一个很好的可能解决方案的视角!但我面临另一个“问题”,我使用了一个组件生成器,为我节省了大量在Joomla 3.1上构建此组件的开发工作。所以我现在面临的是,在foreach循环之后直接使用<?php if($item->state == 1 || ($item->state == 0 && JFactory::getUser()->authorise('core.edit.own','com_ncts.vraagantwoordtoevoegen.‌​'.$item->id))): $show = true; - user1629905

2
不要使用break;,应该使用continue;

2
你可以使用array_slice函数获取$this->items数组的一部分,并将其分配到3个不同的变量中,然后分别循环它们。
$itemsDiv1 = array_slice($this->items, 0, 20);  // gives first 20 items
$itemsDiv2 = array_slice($this->items, 20, 16); // gives next 16 items

and so on..


1
<?php $i = 0; ?> 

<!-- first group -->
<div>

<?php foreach ($this->items as $item) : ?> 
<?php
/**
 * Check if count divided by 20 has no remainder
 */
if ( (++$i % 20) == 0 ): ?>

</div>
<!-- start new group -->
<div>

<?php endif ?>
<?php endforeach ?>

<!-- end last group -->
</div>

0

使用Foreach循环的continue和break示例

$arr = [1=>"apple",2=>"banana",3=>"orange",4=>"grapes",5=>"lichi"];
foreach ($arr as $k => $v) {
  if ($k == 2) {
    continue;
  }
  if ($k == 5) {
    break;
  }
  echo "$k: $v <br>";
}

输出:

1: apple
3: orange
4: grapes

0
$stockNotNull = StockDetail::where('sku', 10101001)
            ->where('stock_quantity', '>', 0)->get('stock_id', 'stock_quantity');
        $toSell = 14;
        // decrements just once for each $stockNotNull
        foreach ($stockNotNull as $product) {
            if ($toSell < 1) {
                return;
            }
            $product->decrement('stock_quantity');
//            $product->stock_quantity--; returns with a null
//            dump($product->stock_quantity);
            $product->save();
            $toSell--;
//            dump($toSell);
            if($product->stock_quantity === 0) {
                continue;
            }
        }

目前我得到的是,按照通常的方式递减即$variable--会给我一个空值,而$product->decrement('stock_quantity')在每次运行时都会减去1,即使stock_quantity字段远大于$toSell变量。逻辑在我的脑海中已经存在,我只是在将数量从当前项目移动到下一个项目时遇到了麻烦,只有当stock_quantity为0时才能这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接