Установка объекта в массиве объектов php - объект не сохраняет измененные данные после цикла - PullRequest
0 голосов
/ 05 февраля 2012

У меня есть массив объектов категорий, и в каждой из них у меня есть список подкатегорий одного типа, т.е.item A -> itemA 1, itemA 2 и т. д. item 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 использовались, показывая до и после, однако $ cats в конце не изменяется, когда это должно быть?

__ _ __ _ __ _ _ 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 ]

1 голос
/ 05 февраля 2012

Это известный PHP гоча. Вы не можете изменить значение объекта массива, изменив enumator. Вам нужно изменить свой код так, чтобы эта строка - $sc = $catChanged; - работала с реальным объектом массива. Это будет выглядеть примерно так: $cats[$catnum]->getSubCats()[$subcatnum] = $catChanged;.

Вы можете сделать это, используя целые числа для итерации по массиву и подмассивам, или вы можете остаться с существующим подходом, но увеличивать целые числа при перемещении по массивам. Первый из них более элегантный, но последний также работает.

0 голосов
/ 05 февраля 2012

Попробуй это.Вам нужно вернуться к объекту $ cat.

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

edit: я просто перечитал ваше исправление.Вы должны поместить логику массива в объект $ cat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...