在php对象数组中设置对象 - 循环后不保留更改数据的对象

时间:2012-02-04 20:31:55

标签: php arrays object

我有一个类别的对象数组,每一个我都有一个相同类型的子类别列表,即。 项目A - > itemA 1,itemA 2等 项目B ...... 当我遍历并匹配子猫时,设置更改时不会保存数据。代码看起来很好,有什么想法吗?

            foreach ($cats as $cat) {
            if($cat->getId() == $catChanged->getCategory_id()) {
                foreach ($cat->getSubCats() as $sc) {
                    if($sc->getId() == $id) {                           
                        var_dump($sc, $key);
                        $sc = $catChanged;                          
                        var_dump($sc, $key);    
                    }
                }               
            }   
        }   
        var_dump(serialize($cats));

正如你所看到的那样,var_dumps已被用于显示之前和之后的结果但最终的$ cat应该是未更改的吗?

__ _ __ _ __ _ _ FIX _ __ _ __ _ __

最后,我从数组中删除了该元素,并将编辑后的对象插入到相同的位置。工作正常,感谢您的回复。

        foreach ($cats as $cat) {
            if($cat->getId() == $catChanged->getCategory_id()) {
                $i = -1;
                foreach ($cat->getSubCats() as $sc) {
                    $i++;
                    if($sc->getId() == $id) {                           
                        $tmp = AdminUtils::removeItem($cat->getSubCats(), $i);  //remove item
                        $cat->setSubCats(AdminUtils::insertArrayIndex($tmp, $catChanged, $i)); //re-insert at index
                        break(2); 
                    }
                }               
            }   
        }

2 个答案:

答案 0 :(得分:1)

这是一个已知的PHP陷阱。您无法通过更改enumator来更改数组对象的值。您需要更改代码,以便此行 - $sc = $catChanged; - 对实际的数组对象进行操作。它看起来像$cats[$catnum]->getSubCats()[$subcatnum] = $catChanged;

您可以通过使用整数迭代数组和子数组来执行此操作,也可以使用现有方法,但在遍历数组时增加位置整数。前者更优雅,但后者也有效。

答案 1 :(得分:0)

试试这个。您需要返回$ cat对象。

foreach ($cat->getSubCats() as $sc) 
{
    if($sc->getId() == $id) 
    {                           
        var_dump($sc, $key);
         $cat->resetSubCat($id, $catChanged); 
    ]
}   

编辑:我只是重读你的修补程序。您应该将数组逻辑放入$ cat对象中。