0

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

该对象具有以下格式:

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 转换为 Array.. 任何帮助将不胜感激!

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

4

2 回答 2

2

我的第一个想法是:

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

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

查看您的结构, Adverts 数组是protected,因此现在可以在不继承 Advertset object的情况下访问它。

所以,我的最终答案一定是:用这种结构是不可能移除它们的!

于 2012-09-18T11:18:37.940 回答
1

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

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

于 2012-09-18T11:17:10.027 回答