PHP遍历多维(数组)对象

时间:2012-09-18 11:08:18

标签: php multidimensional-array foreach

我有一个需要返回的对象,但是我需要在返回之前执行一些预返回操作。

该对象具有以下格式:

object(PaginationHelper)[3]
    public 'current_page' => int 1
    public 'items_per_page' => int 10
    public 'dataset' => 
        array (size=10)
            0 => 
                object(AdvertSet)[4]
                    public 'Keywords' => string '' (length=0)
                    protected 'Adverts' => 
                        array (size=3) // SIZE = 3 SO REMOVE THIS FROM 'dataset' ARRAY
                        ...
                    public 'LiveStatus' => boolean false
            1 => 
                object(AdvertSet)[5]
                    public 'Keywords' => string '' (length=0)
                    protected 'Adverts' => 
                        array (size=1) // SIZE = 1 SO KEEP THIS IN 'dataset' ARRAY
                        ...
                    public 'LiveStatus' => boolean false

      etc etc ....
[End Object]

我需要做什么:

删除“广告”数不为1的“数据集”数组的所有部分,从而仅保留 那些“广告”数组大小为1的数据集。 保留它是一个回归的事实。

我已经尝试过多维递归函数来解决这个问题,但事实上它是一个对象而不是一个数组正在努力进步,而且我不确定我是否能够从一个对象转换为一个数组并再次返回而不会弄乱对象的内部。

任何人都可以帮忙吗?这是迄今为止我用foreach得到的......

foreach($results as $key => $value) {
    if($key == 'dataset') {
    // value is right array to check count
    foreach($value as $k => $v) {
        echo $v;
    }
}
}

它不起作用,但这是我目前正在研究的方法。

我也尝试过类似的事情:

if(count($results->dataset->(Array)AdvertSet->Adverts == 1) { }

但我无法将AdvertSet转换为数组..任何帮助都将非常感谢!

只是一个简单的说明:它不必从数组中删除,我最终需要相同的对象,而没有广告计数为3.那么这可能涉及复制到一个新的数组没有那些有广告计数<> 1。

2 个答案:

答案 0 :(得分:2)

我的第一个想法是:

foreach($PaginationHelper->dataset as &$data) {
  if(count($data) !== 1)
     unset($data);
}

但是在第三次阅读你的问题后,我发现你只想删除那些广告计数不等于1的元素。

查看您的结构,广告数组是受保护的,因此现在可以在不使用子类化广告集对象的情况下访问它。

所以,我的最终答案必须是:使用这种结构删除它们不可能

答案 1 :(得分:1)

您的数据结构真的是递归的,您不需要递归遍历。

您只需要遍历$object->dataset数组并删除广告数不是1的项目。由于您尝试过滤受保护属性上的项目,因此一种方法是实现{{ 1}}返回包含广告数量的方法:AdvertSet::count()。我建议不要为了过滤而强迫你访问受保护的属性。