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]

私は何をする必要がありますか:

'Adverts' カウントが 1 でない 'dataset' 配列のすべての部分を削除し、'Adverts' 配列サイズが 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 を配列としてキャストすることはできません。

簡単なメモ: 配列から削除する必要はありません。最終的には、Adverts カウントが 3 のオブジェクトを除いて同じオブジェクトが必要です。したがって、これには、Adverts カウントを持たない新しい配列へのコピーが含まれる可能性があります。 <> の 1。

4

2 に答える 2

2

私の最初の考えは:

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

しかし、あなたの質問を 3 回目に読んだ後、Adverts カウントが 1 以外の要素のみを削除したいことがわかりました。

構造を見ると、Adverts 配列はprotectedであるため、 Advertset object をサブクラス化せずにアクセスする方法があります。

したがって、私の最終的な答えは次のとおりです。この構造では、それらを削除することはできません!

于 2012-09-18T11:18:37.940 に答える
1

データ構造は実際には再帰的ではなく、再帰的なトラバーサルは必要ありません。

配列を反復処理して、$object->dataset広告の数が 1 ではないアイテムを削除するだけで済みます。保護されたプロパティでアイテムをフィルター処理しようとしているため、1 つのアプローチはAdvertSet::count()、含まれている広告の数を返すメソッドを実装することです$object->dataset[$i]->Adverts->count() != 1。フィルタリングのためだけに、保護されたプロパティにアクセスする方法を強制しないことをお勧めします。

于 2012-09-18T11:17:10.027 に答える