PHP препятствует тому, чтобы цикл foreach перезаписывал объект - PullRequest
1 голос
/ 17 декабря 2011

Я уже четвертый раз пытаюсь написать этот вопрос, поэтому, пожалуйста, потерпите меня.

У меня есть объект PHP, полученный из запроса к БД, который возвращает следующие данные:

[1] => stdClass Object
    (
        [eventId] => 11
        [eventName] => Second Event
        [...]
        [eventChildren] => Array
            (
                [0] => stdClass Object
                    (
                        [childId] => 8
                        [childName] => Jane Doe
                        [...]
                        [gifts] => Array
                            (
                                [0] => stdClass Object
                                    (
                                        [giftId] => 73
                                        [giftName] => My two front teeth
                                        [childId] => 8
                                        [userId] => 1
                                        [eventId] => 11
                                    )
                                [1] => stdClass Object
                                    (
                                        [giftId] => 74
                                        [giftName] => Wasps
                                        [childId] => 8
                                        [userId] => 1
                                        [eventId] => 11
                                    )

                            )

                    )

            )

    )
)

Затем я запускаю массив циклов foreach, чтобы сравнить userId из массива gifts с userId, хранящимся в файле cookie сеанса.

Из этих циклов я создаю массив детей и подарков, выбранных пользователем.

Проблема в том, что это переписывает мой основной объект, а не создает новый.

Петли:

$user = $this->session->userdata('user');
$tempEvents = $events;
$userSelection = array();
$flag = FALSE;

foreach ( $tempEvents as $i => $event )
{
    if ( $i == 0 )
    {
        foreach ( $event->eventChildren as $child ) 
        {
            $userGift = array();

            foreach ( $child->gifts as $gift )
            {
                if ( $gift->userId == $user['userId'] )
                {
                    array_push($userGift, $gift);
                    $flag = TRUE;
                }
            }

            $tempChild = $child;
            $tempChild->gifts = $userGift;

            if ( $flag )
            {
                array_push($userSelection, $tempChild);
                $flag = FALSE;
            }
        }
    }
}

Если I print_r($events);, то отображается отредактированный список, а не полный список событий. Есть ли способ создать дубликат объекта и отредактировать его, а не редактировать исходный объект?

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

Причиной "перезаписи" является $tempChild = $child;.

Это не приведет к глубокому копированию содержимого $child, но заставит $tempChild и $child указывать на одну и ту же структуру данных, чтов данном случае это явно нежелательно.

Вы должны использовать clone, как в следующем примере.

$tempChild = clone $child;

0 голосов
/ 17 декабря 2011

Попробуйте

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