2013-01-24 50 views
3

可能重复:
Getting last 5 elements of a php array获取的foreach PHP最后项目

嗨,我有一个数组各地项目,我想显示最后 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项,我怎样才能得到最后的项目只有

+2

看到这个答案 http://stackoverflow.com/questions/9704983/getting-last-5-elements-of-a-php-array – philipbrown

+1

philipbrown,如果它是一个数组,不是迭代器 - 仍然是一个可能的假设;-) – VolkerK

回答

0

尝试array_slice PHP函数。

如果您想保留键,可以在真正的传递作为第四个参数:

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++; 
} 
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个项目得到加载。

更棒的是,你的代码看起来像你只需要身份证,而不是实际的车型,所以整个事情可以优化到:

$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 
} 
+0

如果它不是数组,那么他为什么写foreach($ collection为$ product_all)....他清楚地说他有“在一个数组中有大约11000项”.. –

+0

因为他不知道更好。迭代器相当有效地伪装成数组。 –

+1

@DipeshParmar,$ collection是Magento的集合对象。它不能像数组一样切片。 – enenen

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

但最好SOLUT根据我的分类和限制你的收藏。如果您只想使用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'); 
相关问题