5

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

 <?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) : ?>

通过array_slice在 foreach 中放置一个,您可以控制要显示的项目。所以在下一个 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;

我如何管理它而不是使用循环?还是您建议另一种方式?

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

4

5 回答 5

9

break打破并停止一个循环。continue跳过循环中的其余代码,并跳转到下一次迭代。

在我看来,使用breakandcontinue是错误的方法。我只需使用两个 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,它会简单地忽略其余的。

于 2013-05-20T17:06:19.493 回答
2

不要使用break;使用continue;

于 2013-05-20T16:58:20.963 回答
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

等等..

于 2013-05-20T17:10:23.803 回答
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>
于 2013-05-20T17:13:44.217 回答
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 时才转移到下一个项目。

于 2020-03-13T08:48:15.693 回答