1

我试图在我从 Magento 提取的产品上使用 for 循环。当我想在循环中的产品上使用索引时它会崩溃。

$collection = Mage::getModel('catalog/product')->getCollection();

$collectionLength = count($collection);
for($j = 0; $j < $collectionLength; $j++)
{
     $productFromStore = $collection[$j];//it crashes on this line of code
     $sku = $productFromStore->getSku();
}

但是当我使用 foreach 循环时,我可以访问所有产品。

foreach($collection as $product)
{
     // this code works fine
     $sku = $product->getSku(); 
}

有人可以解释出了什么问题,为什么?

谢谢。

4

6 回答 6

4

首先,您尝试将集合对象迭代为数组这是错误:

致命错误:不能使用 Mage_Catalog_Model_Resource_Product_Collection 类型的对象作为数组

,第二个 for 循环并不是更好地迭代集合的最佳方法是 foreach 循环,因为 for 循环需要计算数组元素的数量 foreach 不需要它。第三,最好的方法是使用magento资源迭代器。

Mage::getSingleton('core/resource_iterator')
        ->walk(
           $query->getSelect(), 
           array(array($this,'callbackFunction')));

这是一个例子:

public function someGetCollectionMethod()
{
    $products = Mage::getModel('catalog/product')->getCollection();
    Mage::getSingleton('core/resource_iterator')
              ->walk(
                   $products->getSelect(), 
                   array(array($this, 'productsCallback')));
}

public function productsCallback($args)
{
    $product = Mage::getModel('catalog/product');
    $prod = $product->load($args['row']['entity_id']);
    Zend_Debug::dump($prod->getSku());
}

快乐的编码,亚当

于 2018-01-09T12:23:52.450 回答
3

Magento 的 ORM 中的集合类最终Varien_Data_Collection实现了IteratorAggregate; 这就是为什么您能够以类似数组的方式(即foreach)使用集合对象,但不能让它在for循环中工作。一方面,d没有对对象内部元素(_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 的性能

于 2013-08-30T15:31:03.800 回答
0

我不是magento专家,但也许是因为该集合除了数字之外还有不同的键?尝试使用print_r打印出集合以查看对象具有哪些键。

如果您需要使用数字进行迭代,您可以随时执行以下操作:

$i=0;
foreach($collection as $product)
{
     $sku = $product->getSku(); 
     $i++;
}

编辑:无论如何,集合似乎不是常规数组,因此您不能按照您尝试的方式使用它们。

于 2013-08-30T09:18:08.843 回答
0
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

您必须使用的索引无法访问这种类型的数组,

$array["foo"];

如果密钥不可预测,您必须使用

`foreach

于 2013-08-30T09:21:07.717 回答
0

那是因为您正在向 getSku 函数发送一个空值。

<?php
$collection=array("book1"=>"bat","book2"=>"cat");
$collectionLength = count($collection);
for($j = 0; $j < $collectionLength; $j++)
{
    $productFromStore = $collection[$j];
    echo $productFromStore; //prints nothing !
}

foreach($collection as $var)
{
    echo $var; //prints batcat
}
于 2013-08-30T09:32:43.977 回答
-1

在 magento 集合中以对象的形式返回。使用下面的代码获取 SKU 和 NAME。或用于print_r($collection->getData())获取数组 Key=>value 格式的数据。

foreach($collection as $productCollection){
$sku = $productCollection->getSku();
$name = $productCollection->getName();

}

于 2013-08-30T09:19:16.423 回答