PHP foreach 循环跳过前 3 个项目
PHP foreach loop skip first 3 items
我有一个包含 6 种产品的列表,我想将它们分成 2 个列表,每个列表中的 3 个产品彼此相邻。该列表是在 foreach 循环中生成的,第一个列表在计数 == 2 后停止,因此将显示 3 个项目。第二个列表应该从第四个项目开始。我怎样才能做到这一点?
这是 wat 列出的第一个 3 项列表:
<?php
$_categoryId = explode(' ', $category['id']);
$count = 0;
$_productCollection = Mage::getModel('catalog/category')->load($_categoryId)
->getProductCollection()
->addAttributeToSelect('*')
->setOrder('date_added', 'DESC');
?>
<?php foreach ($_productCollection as $_product): ?>
<li class="category-row-list-item">
<a class="product-name" href="<?php echo $_product->getProductUrl() ?>">
<?php echo $this->htmlEscape($_product->getName()) ?>
</a>
</li>
<?php
if($count == 2) break; // Stop after 3 items
$count++;
?>
<?php endforeach ?>
此致,
罗伯特
类似于模函数的东西,每 3 个项目都有一个新数组:
$count = 1;
$count_change = 1;
$key = 0;
$yourList = array(
"1",
"2",
"3",
"4",
"5",
"6",
);
foreach ($yourList as $item) {
if (!isset($$new_list)) {
$new_list = "list" . $count_change . "";
$$new_list = array();
}
if ($count % 3 == 0) {
$key = 0;
$count_change++;
$new_list = "list" . $count_change . "";
$$new_list = array();
}
$$new_list[$key] = $item;
$count++;
$key++;
}
希望这对您有所帮助。
为简单起见,您可以重复 foreach
语句,但对前三项执行相反的操作 continue
。
<?php foreach ($_productCollection as $_product): ?>
<?php
$count++; // Note that first iteration is $count = 1 not 0 here.
if($count <= 3) continue; // Skip the iteration unless 4th or above.
?>
<li class="category-row-list-item">
<a class="product-name" href="<?php echo $_product->getProductUrl() ?>">
<?php echo $this->htmlEscape($_product->getName()) ?>
</a>
</li>
<?php endforeach ?>
关键字continue
用于循环中跳过当前迭代而不退出循环,在这种情况下它使PHP直接回到foreach
的第一行-语句,因此在传递 if
语句之前将计数器增加到 4(因为第 4、5 和 6 是我们所追求的)。
对方法的评论
我让它与您现有的解决方案保持一致,但在这种情况下更简洁的方法可能是使用内置的集合分页。
如果您使用 ->setPageSize(3)
,您可以简单地迭代集合以获取前三个产品,然后使用 ->setCurPage(2)
获取三个项目的第二页。
我在这里链接 this blog post 关于这个主题只是为了给你一个例子来说明它是如何使用的,但由于我不知道你对使用集合的舒适程度我保留我的第一个答案是基于你的现有代码。
我有一个包含 6 种产品的列表,我想将它们分成 2 个列表,每个列表中的 3 个产品彼此相邻。该列表是在 foreach 循环中生成的,第一个列表在计数 == 2 后停止,因此将显示 3 个项目。第二个列表应该从第四个项目开始。我怎样才能做到这一点?
这是 wat 列出的第一个 3 项列表:
<?php $_categoryId = explode(' ', $category['id']); $count = 0; $_productCollection = Mage::getModel('catalog/category')->load($_categoryId) ->getProductCollection() ->addAttributeToSelect('*') ->setOrder('date_added', 'DESC'); ?> <?php foreach ($_productCollection as $_product): ?> <li class="category-row-list-item"> <a class="product-name" href="<?php echo $_product->getProductUrl() ?>"> <?php echo $this->htmlEscape($_product->getName()) ?> </a> </li> <?php if($count == 2) break; // Stop after 3 items $count++; ?> <?php endforeach ?>
此致, 罗伯特
类似于模函数的东西,每 3 个项目都有一个新数组:
$count = 1;
$count_change = 1;
$key = 0;
$yourList = array(
"1",
"2",
"3",
"4",
"5",
"6",
);
foreach ($yourList as $item) {
if (!isset($$new_list)) {
$new_list = "list" . $count_change . "";
$$new_list = array();
}
if ($count % 3 == 0) {
$key = 0;
$count_change++;
$new_list = "list" . $count_change . "";
$$new_list = array();
}
$$new_list[$key] = $item;
$count++;
$key++;
}
希望这对您有所帮助。
为简单起见,您可以重复 foreach
语句,但对前三项执行相反的操作 continue
。
<?php foreach ($_productCollection as $_product): ?>
<?php
$count++; // Note that first iteration is $count = 1 not 0 here.
if($count <= 3) continue; // Skip the iteration unless 4th or above.
?>
<li class="category-row-list-item">
<a class="product-name" href="<?php echo $_product->getProductUrl() ?>">
<?php echo $this->htmlEscape($_product->getName()) ?>
</a>
</li>
<?php endforeach ?>
关键字continue
用于循环中跳过当前迭代而不退出循环,在这种情况下它使PHP直接回到foreach
的第一行-语句,因此在传递 if
语句之前将计数器增加到 4(因为第 4、5 和 6 是我们所追求的)。
对方法的评论
我让它与您现有的解决方案保持一致,但在这种情况下更简洁的方法可能是使用内置的集合分页。
如果您使用 ->setPageSize(3)
,您可以简单地迭代集合以获取前三个产品,然后使用 ->setCurPage(2)
获取三个项目的第二页。
我在这里链接 this blog post 关于这个主题只是为了给你一个例子来说明它是如何使用的,但由于我不知道你对使用集合的舒适程度我保留我的第一个答案是基于你的现有代码。