Перестать PHP объект вести себя как ссылка - PullRequest
0 голосов
/ 10 мая 2018

У меня есть массив объектов, но в цикле он ведет себя как ссылка на PHP.

Также я создаю массив в той же структуре, и он работает как надо.

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

Нажмите здесь, чтобы запустить этот код в PHPFiddle

<code>            // OBJECT
            $pool = [
                    1 => (Object)[
                        'id' => '1',
                        'title' => 'Pool 1'
                    ],
                    2 => (Object)[
                        'id' => '2',
                        'title' => 'Pool 2'
                    ],
                ];

            $items = [
                (Object)['id' => 1],
                (Object)['id' => 2],
            ];

            $vars = [];
            foreach ($items as $i => $item) {

                $vars[$i] = $item;
                $vars[$i]->pool = $pool;

                $vars[$i]->pool[$item->id]->processed = true;
            }


            // ARRAY
            $pool1 = [
                    1 => [
                        'id' => '1',
                        'title' => 'Pool 1'
                    ],
                    2 => [
                        'id' => '2',
                        'title' => 'Pool 2'
                    ],
                ];

            $items1 = [
                ['id' => 1],
                ['id' => 2],
            ];

            $vars1 = [];
            foreach ($items1 as $i1 => $item1) {

                $vars1[$i1] = $item1;
                $vars1[$i1]['pool'] = $pool1;

                $vars1[$i1]['pool'][$item1['id']]['processed'] = true;
            }


            ?>

            <h4>
                Object result
            </h4>
            <pre
                <?php print_r($vars); ?>
            >

Результат массива

>

Результат

            Object result
             stdClass Object
                    (
                        [id] => 1
                        [pool] => Array
                            (
                                [1] => stdClass Object
                                    (
                                        [id] => 1
                                        [title] => Pool 1
                                        [processed] => 1
                                    )

                                [2] => stdClass Object
                                    (
                                        [id] => 2
                                        [title] => Pool 2
                                        [processed] => 1
                                    )

                            )

                    )

                [1] => stdClass Object
                    (
                        [id] => 2
                        [pool] => Array
                            (
                                [1] => stdClass Object
                                    (
                                        [id] => 1
                                        [title] => Pool 1
                                        [processed] => 1
                                    )

                                [2] => stdClass Object
                                    (
                                        [id] => 2
                                        [title] => Pool 2
                                        [processed] => 1
                                    )

                            )

                    )

            )
            >
            Array result
             Array
                    (
                        [id] => 1
                        [pool] => Array
                            (
                                [1] => Array
                                    (
                                        [id] => 1
                                        [title] => Pool 1
                                        [processed] => 1
                                    )

                                [2] => Array
                                    (
                                        [id] => 2
                                        [title] => Pool 2
                                    )

                            )

                    )

                [1] => Array
                    (
                        [id] => 2
                        [pool] => Array
                            (
                                [1] => Array
                                    (
                                        [id] => 1
                                        [title] => Pool 1
                                    )

                                [2] => Array
                                    (
                                        [id] => 2
                                        [title] => Pool 2
                                        [processed] => 1
                                    )

                            )

                    )

            )
            >

1 Ответ

0 голосов
/ 10 мая 2018

Вам необходимо клонировать каждый из объектов внутри $pool, в противном случае ссылка на один и тот же набор объектов сохраняется в каждой копии $pool, которую вы создаете.Это не массив, который «ведет себя как ссылка», это объекты внутри него, которые ведут себя так, как они должны.

В результате вы получите желаемое поведение:

$vars = [];
foreach ($items as $i => $item) {

    $vars[$i] = $item;
    $vars[$i]->pool = $pool;

    //clone each of the objects
    foreach($vars[$i]->pool as $key => $obj) {
      $vars[$i]->pool[$key] = clone $obj;
    }

    $vars[$i]->pool[$item->id]->processed = true;
}

См. http://php.net/manual/en/language.oop5.cloning.php для получения дополнительной информации о клонировании.

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