PHP - 与array_slice()等效的对象;

Lew*_*wis 7 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>";
    }
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我想$categories在通过foreach循环运行它之前从(它们是'Root Category'和'Default')对象中删除前两个类别.最好的方法是什么?我知道我能做到;

if($category->getName() != 'Root Category' && $category->getName() != 'Default'){
  echo $category->getName();
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

编辑2

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

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

Ala*_*orm 5

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

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

默认情况下,PHP对象并不像数组.PHP的内部概念对于一个对象有第一,第二或第三项是什么意思.

您可以foreachcountMagento集合对象的原因就像它是一个数组一样,因为基本集合对象实现了PHP标准库的特殊接口--IteratorAggregateCountable

#File: lib/Varien/Data/Collection.php
class Varien_Data_Collection implements IteratorAggregate, Countable
{
}
Run Code Online (Sandbox Code Playgroud)

通过实现这些接口(通过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);
    }
}
Run Code Online (Sandbox Code Playgroud)

ArrayIterator类创建的objets 没有内置切片功能.这是有道理的 - 从概念上讲,迭代器背后的想法是它允许您遍历列表而不会立即将整个底层列表加载到内存中.Magento和PHP的基础迭代器与已经加载的数组一起工作,这是OO PHP中的一些全面的冗余.

所以,如果你想使用带有Magento集合对象的slice,我会尝试getArrayCopy底层迭代器的方法.

$array = array_slice($categories->getIterator()->getArrayCopy(), 2);
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助!

  • @Lewis **集合** 对象将失去其方法。但是,生成的数组仍应包含单独的类别对象。即 $category-&gt;getName() 仍然有效。 (2认同)