我正在尝试删除对象中的前两个项目。例如,如果要从数组中删除前两个项目,可以使用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集合对象当作数组来foreach
或count
,是因为基本集合对象实现了PHP标准库中的特殊接口(interface)IteratorAggregate和Countable
#File: lib/Varien/Data/Collection.php
class Varien_Data_Collection implements IteratorAggregate, Countable
{
}
通过实现这些接口(interface)(通过按照上面的手动链接在
Varien_Data_Collection
中定义方法),该对象将获得foreach
和count()
功能。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数组。
希望对您有所帮助!