2012-09-18 225 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