【问题标题】:Get last items in foreach php [duplicate]获取foreach php中的最后一项[重复]
【发布时间】:2013-01-07 23:16:17
【问题描述】:

可能重复:
Getting last 5 elements of a php array

您好,我有大约 11000 个项目 在一个数组中,我只想显示 last 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++; 
}

有了这个我得到了 first 2 个项目,我怎样才能只得到最后一个项目

【问题讨论】:

标签: php magento collections foreach iterator


【解决方案1】:

如果你想要最后一个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

【讨论】:

    【解决方案2】:

    这是 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 个项目”..
    • 因为他不知道更好。迭代器非常有效地将自己伪装成数组。
    • @DipeshParmar,$collection 是 Magento 的集合对象。它不能像数组一样被切片。
    • +1 for enenen 对 magento 了解不多,但对其他人肯定有帮助...
    【解决方案3】:

    试试这个

    <?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');
    

    【讨论】:

      【解决方案4】:

      使用您的代码示例...

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

      【讨论】:

        【解决方案5】:

        您可以使用array_slice

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

        【讨论】:

          【解决方案6】:

          试试array_slicephp函数。

          如果要保留ke​​y,可以传入true作为第四个参数:

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

          【讨论】:

            【解决方案7】:

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

            $items = array_slice($items, -5);
            

            【讨论】:

            • 在 Magento 中不起作用,因为它被标记了。
            猜你喜欢
            • 1970-01-01
            • 2021-12-13
            • 2020-06-08
            • 2013-01-30
            • 2021-11-04
            • 1970-01-01
            • 2017-08-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多