Magento の ORM のコレクション クラスは、最終的Varien_Data_Collection
に実装するサブクラスIteratorAggregate
です。これが、コレクション オブジェクトを配列のような方法 (つまりforeach
) で操作できるのに、for
ループでは機能しない理由です。1 つには、オブジェクト内の要素 (_items
配列メンバー)へのキーベースの直接アクセスはありません_items
。配列のキーが行 ID に基づいていることを考えると、残念です。
結論:for
ループ内でコレクション アイテムを操作するのは簡単ではありませんIteratorAggregate
。
両方の例を次に示します。コレクションのアイテムを直接操作する必要がある場合は、 を使用できますが$collection->getItems()
、_items
配列キーはデータに基づいているため、連続していない可能性があることに注意してください。name
また、 Magento の EAV パターンを使用して保存されたコレクションに属性値を追加する必要があることに注意してください。
<?php
header('Content-Type: text/plain');
include('app/Mage.php');
Mage::app();
$collection = Mage::getResourceModel('catalog/product_collection');
$collection->addAttributeToSelect('name');
//for loop - not as much fun
for ($j=0;$j<count($collection);$j++) { //count() triggers $collection->load()
$items = $collection->getItems();
$item = current($items);
echo sprintf(
"%d:\t%s\t%s\n",
$k,
$item->getSku(),
$item->getName()
);
next($items); //advance pointer
}
//foreach - a bit better
foreach ($collection as $k => $product) {
echo sprintf(
"%d:\t%s\t%s\n",
$k,
$product->getSku(),
$product->getName()
);
}
疑問に思っている場合に備えて: PHP での FOR と FOREACH のパフォーマンス