在数组中推送的对象的意外行为

时间:2015-02-16 13:37:15

标签: php arrays

我制作了一个脚本,在foreach循环中创建一个对象,该对象充满了信息,然后进入嵌套的foreach循环,添加更多信息。

该脚本用于概述信息,按用户发布帖子+其他一些信息

$data = array();

foreach ($users as $user)
{
    $row = new stdClass();

    $row->user = $user;
    $row->name = fullname($user);

    $posts = getPosts($user);

    foreach ($posts as $post)
    {
        $row->title = $post->title;
        $row->datetime = $post->date;

        $row->views = getViews($post->id);

        $data[] = $row;
    }
}

当脚本完成所有"行"在$data中,每个用户都是相同的,都显示该用户最后添加的行。 当我在将它放入数组之前检查该行时,它是我所期望的信息,虽然我已经将它放在一个数组中,但它似乎仍然被主动使用。

我应该在将对象放入数组之前将其关闭吗?

提前致谢!

= EDIT =

$data[] = $row;位于正确位置,因为我希望输出如下:

Emma  | 'My first post!' | 22-10-2014 | 8
Emma  | 'posting again!' | 23-10-2014 | 24
Emma  | 'Back from ...'  | 02-01-2014 | 69
Rick  | 'youknowit'      | 10-10-2013 | 45
Freud | 'Yo momma'       | 01-01-1970 | 123
Frued | 'fruitsalad'     | 02-02-2010 | 3

1 个答案:

答案 0 :(得分:2)

[更新]使用添加到问题中的新信息,您的代码更有意义:)解决方案变得更加简单:只需clone $row每个$post - 循环。

foreach ($users as $user)
{
    $row = new stdClass();

    $row->user = $user;
    $row->name = fullname($user);

    $posts = getPosts($user);

    foreach ($posts as $post)
    {
        $item = clone $row; //<-- clone $row, $data will end up as you desire

        $item->title = $post->title;
        $item->datetime = $post->date;
        $item->views = getViews($post->id);

        $data[] = $item;
    }
}