4

Zend_Db_Table_Rowsetオブジェクトに格納されているデータ行を繰り返し処理し、特定の基準を満たしていない場合は、一部の行を削除/設定解除したいと思います。

toArray()を使用して、オブジェクトからデータ行のみを取得すると、不要な行の設定を簡単に解除できます。しかし、私は自分のオブジェクトをさらに使用するために保持したいので、それはしたくありません。

もちろん、1つの解決策は、必要なものだけを取得するようにクエリを調整することですが、このシナリオではそれは不可能です。少なくとも私には方法がわかりません。

うまくいかなかった次のことを試しました:

foreach ($rowset as $key => $row)
{
    if (!$condition == satisfied)
    {
        unset($rowset[$key]);
    }
}

そしてもちろん、$ rowset [$ key]がないため、機能しません...データはサブ配列[_data:protected]に保存されますが、unset $ rowset [_data:protected][$key]は機能しませんでしたどちらかで動作します。

たぶん、行セットオブジェクト(または一般的なオブジェクトの表現)の私の概念は、私が何をしているのかを理解するのに十分成熟していません。説明やヒントは大歓迎です!

[編集]$row-> deleteはオプションではありません。データベースから行を削除したくありません!最初に配列を作成したくありません。必要な場合は、$ rowset-> toArray()[/EDIT]を実行するだけです。

解決策:私もできなかったと思ったことを実行することになりました。つまり、すべてを最初のクエリに統合しました。

4

4 に答える 4

6

カスタム行セット クラスのメソッドの例:

public function removeFromRowset($id) {
    foreach ($this->_rows as $i => $v) {
        if ($v->id == $id) { // found Row we want to remove
            unset($this->_rows[$i]); // delete both rowset
            unset($this->_data[$i]); // and original data
            break; // not necessary to iterate any more
        }
    }
    $this->_data = array_values($this->_data); // reindex both arrays (otherwise it breaks foreach etc.)
    $this->_rows = array_values($this->_rows);
    $this->_count = count($this->_data); // don't forget to update items count!
}

Rowset を反復処理し、その ID (「id」が一意の識別子であると仮定) に従って Row を検索し、Rowset から削除します。

これはデータベースから行を削除するのではなく、Rowset から削除するだけであることに注意してください。

于 2011-06-13T21:30:14.183 に答える
4

カスタム Rowset クラスを使用できます

このクラスは、内部に保存されている保護された $_rows にアクセスでき、フィルタリングを適用するパブリック メソッドを追加できます。

于 2009-04-18T21:38:36.913 に答える
1

これを行う方法があることを知りません。最初に配列を作成してから、配列を変更できます。

$rows = array();
foreach($rowset as $row)
{
     $rows[$row->id] = $row;
}

foreach ($rows as $key => $row)
{
     if(!$condition == satisfied)
     {
         unset($rows[$key]);
     }
}

最も効率的なことではありませんが、機能します。

于 2009-04-18T17:41:04.613 に答える
-2

個々の行オブジェクトで delete() メソッドを使用することもできます。

foreach ($rowset as $row)
{
    if (!$condition == satisfied)
    {
       $row->delete();
    }
}
于 2009-04-18T17:48:14.720 に答える