【问题标题】:PHP - Object equivalent of array_slice();PHP - 等效于 array_slice() 的对象;
【发布时间】:2016-03-11 15:01:17
【问题描述】:

我正在尝试删除对象中的前两项。例如,如果我想从数组中删除前两项,我会使用 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(它们是“根类别”和“默认”)对象中删除前两个类别。解决这个问题的最佳方法是什么?我知道我能做到;

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

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

编辑

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

编辑 2

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

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

【问题讨论】:

  • 等等,$categories 不是 category 对象的数组吗?
  • “空白屏幕”可能意味着错误。发生这种情况时您检查过错误日志吗?
  • 但这感觉像是一个肮脏的解决方案。 ...这是我迄今为止从整个 Magento 中获得的感觉*叹息*跨度>
  • 如果你将数组转换为非标准对象,你将失去所有方法对象
  • 我从未使用过 Magento,但根据对 this question 的回答,似乎可以在您的收藏集上调用 addAttributeToFilter() 函数,这可能会有所帮助。

标签: php arrays magento


【解决方案1】:

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

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

默认情况下,PHP 对象表现得像数组。 PHP 内部没有关于对象具有第一项、第二项或第三项意味着什么的内部概念。

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

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

通过实现这些接口(通过根据上面的手动链接在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 中有点普遍的冗余。

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

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

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

希望有帮助!

【讨论】:

  • 这很有趣,谢谢!但是,将其复制到一个数组并对其进行切片,我会假设生成的数组会丢失对象方法,从而使其难以在 foreach 循环中使用?
  • @Lewis collection 对象将失去其方法。但是,结果数组仍应包含单独的类别对象。即 $category->getName() 仍然可以工作。
【解决方案2】:

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

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


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

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 2018-03-25
    • 2013-08-07
    • 2020-07-27
    • 2012-11-05
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多