use*_*811 4 php loops reference object
我有以下PHP代码为每个帖子设置parentId.每个数据的parentId都成为最后一个帖子ID.我的逻辑出了什么问题?
顺便说一句,如果我把它改成数组,那么每一件事都可以.请帮忙!
$data = array(
    (object)array('name' => 'myname')
);
$posts = array(
    (object)array('ID' => 1, 'data'=>$data),
    (object)array('ID' => 2, 'data'=>$data),
    (object)array('ID' => 3, 'data'=>$data)
);
foreach($posts as &$post){
    $post->data[0]->parentId = $post->ID;
}
print '<pre>';print_r($posts);die;
die;
结果:
Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [data] => Array
                (
                    [0] => stdClass Object
                        (
                            [name] => myname
                            [parentId] => 3 // expect to be 1
                        )
                )
        )
    [1] => stdClass Object
        (
            [ID] => 2
            [data] => Array
                (
                    [0] => stdClass Object
                        (
                            [name] => myname
                            [parentId] => 3 // expect to be 2 !!!
                        )
                )
        )
    [2] => stdClass Object
        (
            [ID] => 3
            [data] => Array
                (
                    [0] => stdClass Object
                        (
                            [name] => myname
                            [parentId] => 3
                        )
                )
        )
)
考虑到所有事情,这里真正的问题是,在您第二眼看到您的代码之后,您将设置该data属性的方式.从PHP5开始,默认情况下通过引用传递/分配对象.还记得PHP4天吗?($newInstance = &new SomeClass();),PHP5现在使用对象的引用,所以当你这样做时:
$data = array(
    (object)array('name' => 'myname')//create object
);
然后,所有三个对象都被分配了相同的对象(通过引用!),因此如果您第一次更改它,所有三个实例将反映相同的更改!
我最近在循环中对循环中的引用发布了一个冗长的答案,它可能值得一看,因为通过引用循环不是开展业务的最佳方式.
一些代码审查:
 
我只是这样做,而不是构建所有这些数组,并将它们单独转换为对象:
$data = array(
    array('name' => 'myname')
);
$posts = array(
    array('ID' => 1, 'data'=>$data),
    array('ID' => 2, 'data'=>$data),
    array('ID' => 3, 'data'=>$data)
);
foreach($posts as $k => $post)
{
    $posts[$k]['data'][0]['parentId'] = $posts[$k]['ID'];
}
$posts = json_decode(json_encode($posts));//turns everything into objects
print_r($posts);
起初,它似乎对json_encode某些东西效率低下,只是json_decode它,但json_decode返回对象,而不是默认的关联数组.我不久前运行了一些测试脚本,结果证明:编码 - 解码方法实际上比铸造每个关联数组更快......