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


Setting object in php object array - the object not keeping changed data after loop

我有一个Categories的对象数组,在每个数组中我都有一个相同类型的子类别列表,即。项目A->项目A1、项目A2等。项目B。。。当我遍历并匹配子cat时,设置更改时不会保存数据。代码看起来不错,有什么想法吗?

            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已经被用来显示之前和之后,但是结尾的$cats在应该改变的时候没有改变?

最后,我从数组中删除了那个元素,并在同一位置插入了编辑过的对象。运行良好,感谢您的回复。

        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); 
                    }
                }               
            }   
        }

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

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

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

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

编辑:我刚刚重读了你的修正案。您应该将数组逻辑放入$cat对象中。