views:

755

answers:

3

I would like to iterate over the data rows stored in a Zend_Db_Table_Rowset object and then drop/unset some of the rows, if they don't fulfil certain criteria.

I could use toArray() to get only the data rows from the object and then it would be easy to unset the rows I don't need. But since I want to keep my object for further use I don't want to do that.

Of course one solution would be to adjust my query in order to retrieve only what I need, but that's not possible in this scenario. At least I wouldn't know how.

I tried the following which didn't work:

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

And of course it doesn't work, since there is no $rowset[$key]... the data is stored in a subarray [_data:protected] but unset $rowset[_data:protected][$key] didn't work either.

Maybe my conception of a rowset object (or the representation of objects in general) is not mature enough to understand what I'm doing. Any clarification and tips would be welcome!

[EDIT] $row->delete is NOT an option, I don't want to delete the row from the database! I don't want to create an array first, if I wanted to I would just do $rowset->toArray() [/EDIT]

Solution: I ended up doing what I thought I wasn't able too, meaning I integrated everything into the initial query.

A: 

I don't know that there is a way to do this. You could first create an array and then modify the array.

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

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

Not the most efficient thing to do but it works.

smack0007
nope, I need the object to be healthy. and creating an array goes easy with $rowset->toArray()
tharkun
$rowset->toArray() doesn't produce row objects. It returns the whole rowset as an array. That's why I didn't use it.
smack0007
The custom rowset class above is probably your best bet.
smack0007
A: 

You can also use the delete() method on the individual row object.

foreach ($rowset as $row)
{
    if (!$condition == satisfied)
    {
       $row->delete();
    }
}
gmcrist
delete is destructive. The row will be deleted from the table.
Darryl E. Clarke
maybe I wasn't clear but I don't want to delete the row from the table, I just want to remove it from the object!!
tharkun
Please accept my apologies for not understanding what you were wanting to do. As dcaunt suggested, and smack0007 affirmed, using a custom rowset would be the best option.
gmcrist
+1  A: 

You could use a custom Rowset class

This class would have then access to the protected $_rows stored internally, and you could add a public method to applying your filtering

David Caunt
I ended up doing what I thought I wasn't able too, meaning I integrated everything into the query. But thanks for the custom rowset input which I will certainly need at one point.
tharkun