我面临一个问题。我在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上折叠一个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;
与循环相比,我该如何管理它?还是你建议换一种方式?
提前感谢!真的帮助我理解了循环!!
break
中断并停止循环。continue
跳过循环中的其余代码,并跳到下一次迭代。
在我看来,使用break
和continue
是错误的方法。我会简单地使用两个循环:
$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,它将忽略其余部分
您可以使用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
等等。
不要使用break;
使用continue;
<?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>
$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->reduce('stock_quantity'(每次运行都减去1,即使stock_quanty字段远大于$toSell变量。逻辑就在我的脑海中,我只是很难从当前项目中提取数量,只有当stock_quantity为0时才能转到下一个项目。
continue的示例;和断裂;带有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