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 个项目,我怎样才能只得到最后一个项目

4

7 回答 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();

这可以更改为(反向 ORDER,添加 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
}
于 2013-01-24T09:13:00.910 回答
1

看看http://php.net/manual/en/function.array-slice.php

$items = array_slice($items, -5);
于 2013-01-24T09:05:21.893 回答
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');
于 2013-01-24T09:23:22.217 回答
0

尝试array_slice php 函数。

如果要保留密钥,可以传入 true 作为第四个参数:

array_slice($a, -5, 5, true);
于 2013-01-24T09:07:26.917 回答
0

您可以使用array_slice

$last = array_slice($collection, -5);
于 2013-01-24T09:10:24.233 回答
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++; 
}
于 2013-01-24T09:10:28.877 回答
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.

于 2013-01-24T09:19:22.320 回答