我有一个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对象中。