用php在数组中存储对象

用php在数组中存储对象,php,arrays,codeigniter,object,Php,Arrays,Codeigniter,Object,我有一个从数据库中提取行的函数,content->id和content->type用于在已经加载的模型中动态调用amethod,以获取和格式化对象的详细信息。返回对象后,它将被添加到数组中。一切都很好,只是当我开始使用数组时,尽管数组中的项目数正确,但它们都包含相同的对象,即使我知道它们返回的是不同的。我完全不知道这一点,任何帮助/想法都会很棒 代码如下: foreach($query->result() as $content) { $item = $this->{'mod

我有一个从数据库中提取行的函数,content->id和content->type用于在已经加载的模型中动态调用amethod,以获取和格式化对象的详细信息。返回对象后,它将被添加到数组中。一切都很好,只是当我开始使用数组时,尽管数组中的项目数正确,但它们都包含相同的对象,即使我知道它们返回的是不同的。我完全不知道这一点,任何帮助/想法都会很棒

代码如下:

foreach($query->result() as $content)
{
    $item = $this->{'mod_'.$content->type}->get($content->id);
    print_r($item);
    $items[] = $item;
}
print_r($items);
print_r语句产生以下结果:

stdClass Object
(
    [id] => 30
    [type] => page
)

stdClass Object
(
    [id] => 29
    [type] => page
)

Array
(
    [0] => stdClass Object
        (
            [id] => 29
            [type] => page
        )

    [1] => stdClass Object
        (
           [id] => 29
           [type] => page
        )

)

您可能返回的是对项目的引用,而不是项目本身。它将始终是$item指向的最后一个引用

我猜问题在于每次通过引用从
get
函数获取同一个对象,然后通过引用将其添加到数组中,从而在
get
函数中修改该项时,会修改数组中的所有项。如果是这种情况,则应采取以下措施:

foreach($query->result() as $content)
{
    $item = $this->{'mod_'.$content->type}->get($content->id);
    print_r($item);
    $items[] = clone $item;
}
print_r($items);

当您将$item推送到$items时,它不会将$item指向的值推送到,而是推送到引用本身。每次都需要初始化$item:

foreach($query->result() as $content)
{
    $item = new stdClass();
    $item = $this->{'mod_'.$content->type}->get($content->id);
    print_r($item);
    $items[] = $item;
}
print_r($items);

这是你的代码的真实复制粘贴吗?我原以为这样的东西会有问题,但每次初始化都不起作用$items[]=clone($item)做了第二次检查,很容易理解为什么这种方法不起作用$items是一个填充了$item的数组,它仍然是一个引用。重新初始化$item意味着所有项仍将引用同一对象。如上所述,clone()是一种方式:)