在PHP中使用foreach获取最后几项

3

可能是重复的问题:
获取PHP数组的最后5个元素

你好,我有一个包含大约11000个项目的数组,我想只显示最后5或10个项目

$i = 0;
foreach ($collection as $product_all) { 
 if($i==2) break;    
 echo $product_all->getId();        
   $neew = Mage::getModel('catalog/product')->load($product_all->getId());         
echo'<pre>';
    print_r($neew); 
$i++; 
}

我拿到了前两个物品,如何只获取后面的物品?


2
请查看此答案https://dev59.com/lWkw5IYBdhLWcg3ws8z3 - philipbrown
1
philipbrown,如果它是一个数组而不是迭代器——尽管这是一个可能的假设;-) - VolkerK
7个回答

3
这是Magento,$collection不是一个数组,而是一个迭代器。这意味着像array_slice这样的数组函数不起作用,但你可以模拟逆序的foreach操作来达到同样的效果:
end($collection);
while($current = current($collection)) {
    // ... (see below)
    prev($collection);
}

在循环内部,您将构造最后5个项目的数组,并在获取它们后中断:

$lastFive[] = $current;
if (count($lastFive) == 5) break;

编辑:既然我们已经解决了你的问题,让我们谈一谈性能。从数据库中获取11000个项目到内存中,只使用其中的5或10个,这是一个非常糟糕的想法。您应该找到加载$collection的代码并从那里开始。最可能的情况是:

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->setOrder('id', 'asc')->load();

那可以修改为(倒序排列,添加LIMIT):
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->setOrder('id', 'desc')->setPageSize(5)->load();

只会加载最后 5 个项目。

更好的是,你的代码似乎只需要 id,而不是实际模型,因此整个过程可以进行优化:

$collection = Mage::getModel('catalog/product')->getCollection();
$ids = $collection->setOrder('id', 'desc')->setPageSize(5)->getAllIds();
foreach ($ids as $id) {
    $product = Mage::getModel('catalog/product')->load($id);
    // do what you want
}

如果不是数组,那么为什么他写了foreach ($collection as $product_all)....他明确说他有“大约11000个项目在一个数组中”.. - Dipesh Parmar
因为他不知道更好的方法,迭代器可以很有效地伪装成数组。 - Fabian Schmengler
1
@DipeshParmar,$collection是Magento的集合对象。它不能像数组一样被分片。 - enenen
+1 对于enenen来说很有帮助,虽然我不太了解Magento,但肯定对其他人有帮助... - Dipesh Parmar

1

无法在Magento中正常工作,因为它被标记了。 - Christophe Ferreboeuf

0

尝试使用 array_slice php 函数。

如果您想保留键,则可以将 true 作为第四个参数传入:

array_slice($a, -5, 5, true);

0

使用你的代码示例...

$i = 0;
$no = count($collection);
foreach ($collection as $product_all) { 
 if($i >= ($no-10)) {
     echo $product_all->getId();        
     $neew = Mage::getModel('catalog/product')->load($product_all->getId());         
     echo'<pre>';
     print_r($neew); 
  }
  $i++; 
}

0

如果您想获取最后的 X 个项目:

$i = 0;
$totalCount = count($collection);
$itemsCount = 5; 
$x = $totalCount - $itemsCount;

foreach ($collection as $product_all) {
    if ($i < $x) {
        $i++;
        continue;
    }
    echo $product_all->getId();
    $neew = Mage::getModel('catalog/product')->load($product_all->getId());
    echo'<pre>';
    print_r($neew);
    $i++;
}

如果你只想要最后一个,你可以使用:
$lastItem = $collection->getLastItem();

但是最好的解决方案是根据我的建议对您的集合进行排序和限制。如果您只想使用其中的5或10个产品,为什么要获取11000多个产品呢?如果您没有进行任何排序就获取了这些产品,那么它们将按照我记得的created_at属性排序。您可以简单地按降序排序并限制到X


0

试试这个

<?php
$array  = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

function foreach_last($array, $n, $func) {
    reset($array);
    end($array);
    $i  = 0;
    $n  = min($n, count($array)) - 1;
    while ( $i ++ < $n ) 
        prev($array);
    $func(current($array), key($array));
    while ( $v = next($array) ) {
        $func($v, key($array));
    }
}
function print_e($v, $k) {
    printf("k: %s, v: %s\n", $k, $v);
}

foreach_last($array, 5, 'print_e');

0

你可以使用array_slice

$last = array_slice($collection, -5);

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