我正在尝试删除对象中的前两个项目。例如,如果要从数组中删除前两个项目,可以使用array_slice($ arrayName,2)。

我已经在我的对象上尝试过此方法(嘿,为什么不这样做?我知道从技术上讲它不是数组,但是我很乐观),但是它没有用。

搜索时,我发现的只是从数组中删除项目的方法。

    $categories = array_slice(Mage::getModel('catalog/category')->getCollection()->addAttributeToSelect('*'), 2);


    foreach($categories as $category){
        echo "<div class='col'>{$category->getName()}</div>";
    }

在上面的示例中,我想在通过foreach循环运行它之前,从$categories对象中删除前两个类别(“Root Category”和“Default”)。最好的方法是什么?我知道我能做到;
if($category->getName() != 'Root Category' && $category->getName() != 'Default'){
  echo $category->getName();
}

但这感觉像是一个肮脏的解决方案。

编辑

阅读了Patrick Q的评论后,我意识到这确实是一个对象数组。所以我的问题变成了,为什么在将array_slice应用于此数组时,会导致黑屏?当未应用array_slice时,循环工作正常。

编辑2

忽略最后的编辑。它是一个对象。

至于可能的重复,虽然这个问题确实确实帮助我解决了我的问题,但我认为,从本质上讲,它们是不同的问题。这个问题的核心是围绕为对象找到一个有用的替代array_slice()的方法。另一方面,相关问题想找到一种方法,特别是根据下拉属性过滤Magento集合的方法。他们可能到达了相同的目的地,但目的和旅程却大不相同。

最佳答案

据我所知,Magento中不存在该功能。



默认情况下,PHP对象不像数组那样起作用。 PHP没有内部概念,对象具有第一,第二或第三项意味着什么。

之所以可以将Magento集合对象当作数组来foreachcount,是因为基本集合对象实现了PHP标准库中的特殊接口(interface)IteratorAggregateCountable

#File: lib/Varien/Data/Collection.php
class Varien_Data_Collection implements IteratorAggregate, Countable
{
}

通过实现这些接口(interface)(通过按照上面的手动链接在Varien_Data_Collection中定义方法),该对象将获得foreachcount()功能。

Magento的IteratorAggregate实现(为您提供foreach功能的东西)依赖于PHP内置的ArrayIterator
#File: lib/Varien/Data/Collection.php
class Varien_Data_Collection implements IteratorAggregate, Countable
{
    public function getIterator()
    {
        $this->load();
        return new ArrayIterator($this->_items);
    }
}

ArrayIterator类创建的对象具有no built in slice functionality。这是有道理的-从概念上来说behind an iterator是允许您遍历列表而不将整个基础列表立即加载到内存中的想法。 Magento和PHP的基本迭代器可用于已加载的数组,这是OO PHP中所有常见冗余的一部分。

因此,如果您想将切片与Magento集合对象一起使用,则可以尝试使用底层迭代器的getArrayCopy方法。
$array = array_slice($categories->getIterator()->getArrayCopy(), 2);

这应该(未经测试)返回带有预期元素切片的PHP数组。

希望对您有所帮助!

09-10 05:05
查看更多