PHP - 对象array_slice();

时间:2016-03-11 15:01:18

标签: php arrays magento

我试图删除对象中的前两项。例如,如果我想从数组中删除前两项,我将使用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>";
    }

在上面的示例中,我想从$categories中删除前两个类别(这些类别是&#39;根类别&#39;默认&#39;)对象在通过foreach循环运行之前。最好的方法是什么?我知道我能做到;

if($category->getName() != 'Root Category' && $category->getName() != 'Default'){
  echo $category->getName();
}

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

修改

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

编辑2

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

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

2 个答案:

答案 0 :(得分:5)

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

  

我正在尝试删除对象中的前两项 (强调我的)

默认情况下,PHP对象就像数组一样。 PHP对于一个对象拥有第一,第二或第三项的意义没有内在的概念。

您可以foreachcount Magento集合对象的原因就像它是一个数组一样,因为基本集合对象实现了PHP标准库中的特殊接口 - IteratorAggregate和{ {3}}

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

通过实现这些界面(通过根据上面的手动链接在Varien_Data_Collection中定义方法),对象获得foreachcount()功能。

Magento的IteratorAggregate实现(赋予你foreach功能的东西)依赖于PHP内置的Countable

#File: lib/Varien/Data/Collection.php
class Varien_Data_Collection implements IteratorAggregate, Countable
{
    public function getIterator()
    {
        $this->load();
        return new ArrayIterator($this->_items);
    }
}

ArrayIterator班级创建的对象有ArrayIterator。这是有道理的 - 概念上,no built in slice functionality的概念是它允许您遍历列表而不会立即将整个底层列表加载到内存中。 Magento和PHP的基础迭代器与已经加载的数组一起工作,这是OO PHP中的一些常见冗余。

因此,如果你想将slice与Magento集合对象一起使用,我会尝试底层迭代器的getArrayCopy方法。

$array = array_slice($categories->getIterator()->getArrayCopy(), 2);

这应该(未经测试)返回一个PHP数组,其中包含预期的元素切片。

希望有所帮助!

答案 1 :(得分:3)

LimitIterator是切片函数的迭代器相关版本。您可以像使用它一样使用它:

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


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