我想迭代存储在Zend_Db_Table_Rowset对象中的数据行,然后删除/取消设置某些行,如果它们不符合某些条件。
我可以使用toArray()来获取对象中的数据行,然后很容易取消我不需要的行。但由于我想保留我的对象以供进一步使用,我不想这样做。
当然,一种解决方案是调整我的查询以便仅检索我需要的内容,但在这种情况下这是不可能的。至少我不知道怎么做。
我尝试了以下无效的方法:
foreach ($rowset as $key => $row)
{
if (!$condition == satisfied)
{
unset($rowset[$key]);
}
}
当然它不起作用,因为没有$ rowset [$ key] ...数据存储在子数组[_data:protected]中但是未设置$ rowset [_data:protected] [$ key]也没用。
也许我对行集对象(或一般对象的表示)的概念还不够成熟,无法理解我在做什么。欢迎任何澄清和提示!
[编辑] $ row-> delete不是一个选项,我不想删除数据库中的行! 我不想先创建一个数组,如果我想,我只想做$ rowset-> toArray() [/编辑]
解决方案:我最终做了我认为无法做到的事情,这意味着我将所有内容都集成到初始查询中。
答案 0 :(得分:6)
custom rowset class的示例方法:
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找到Row(假设“id”是唯一标识符),然后从Rowset中删除它。
请注意,这不会从数据库中删除该行,只是将其从Rowset中删除!
答案 1 :(得分:4)
您可以使用custom Rowset class
然后,这个类可以访问内部存储的受保护的$ _rows,并且可以添加一个公共方法来应用过滤
答案 2 :(得分:1)
我不知道有办法做到这一点。您可以先创建一个数组然后修改数组。
$rows = array();
foreach($rowset as $row)
{
$rows[$row->id] = $row;
}
foreach ($rows as $key => $row)
{
if(!$condition == satisfied)
{
unset($rows[$key]);
}
}
不是最有效的事情,但它有效。
答案 3 :(得分:-2)
您还可以对单个行对象使用delete()方法。
foreach ($rowset as $row)
{
if (!$condition == satisfied)
{
$row->delete();
}
}