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、配列ではなく Iterator です。これは、次のような配列関数が機能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
}
于 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

array_slicephp関数を試してください。

キーを保持したい場合は、4番目の引数としてtrueを渡すことができます。

array_slice($a, -5, 5, true);
于 2013-01-24T09:07:26.917 に答える
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

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 に答える
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 に答える