2012-09-18 178 views
0

我有一个需要返回的对象,但是我需要在返回之前执行一些预回退操作。PHP遍历多维(数组)对象

对象的格式如下:

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

我的第一个想法是:

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

但是看完你的问题,第三次之后,我看你只想删除了广告的那些元素计数不等于1

看着你的结构广告阵列是受保护的,因此现在有方法可以访问它,而不需要子类别的广告组对象

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

+0

我喜欢'&$ data' +'unset'的使用 –

+0

@Alex LOL ..在foreach中的一个常见错误是缺少的& – JvdBerg

+0

我可能没有很好地澄清,我正在计数(Object)PaginationHelper - >(数组) - >(对象)AdvertSet - >(数组)广告 - 然后如果广告的计数为1,保留它,否则删除'数据集' – Jimbo

1

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

您只需遍历$object->dataset数组并删除广告计数不为1的项目。由于您试图在受保护的属性上过滤项目,因此一种方法是实施将返回的AdvertSet::count()方法包含广告的数量:$object->dataset[$i]->Adverts->count() != 1。我建议不要强迫自己的方式访问受保护的属性只是为了过滤。

+0

再次看:广告是受保护的! – JvdBerg

+0

对不起,错过了。你仍然不需要递归遍历,很快就会更新答案。 – lanzz