PHP中的Foreach break和continue

ohfgkhjo  于 2023-03-22  发布在  PHP
关注(0)|答案(6)|浏览(169)

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

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

但我想呼应前20项,并继续以下16项。
我已经设法使它做一个休息后,20个项目,但我没有得到以下16个项目(从NR 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上折叠一个div,将显示前20个项目,如果用户单击div 2,将显示接下来的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;

我怎么能管理它比与循环?或者你建议另一种方式?
提前感谢!真的帮助我理解了循环!!

4xy9mtcn

4xy9mtcn1#

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,则忽略其余项。

vnjpjtjt

vnjpjtjt2#

你可以使用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

等等。

w46czmvw

w46czmvw3#

不要使用break;使用continue;

rkue9o1l

rkue9o1l4#

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

vsmadaxz5#

$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时从当前项目中获取数量并移动到下一个项目时遇到了麻烦。

kqhtkvqz

kqhtkvqz6#

例如继续;和break;使用Foreach循环

$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

相关问题