【问题标题】:Storing objects in an array with php用php将对象存储在数组中
【发布时间】:2010-11-07 01:59:23
【问题描述】:

我有一个从数据库中提取行的函数,content->id 和 content->type 用于在已加载的模型中动态调用方法来获取和格式化对象详细信息。一旦对象被返回,它就会被添加到数组中。一切都很好,除了当我开始使用数组时,虽然它有正确数量的项目,但它们都包含相同的对象,即使我知道它们返回不同。我对这个完全不知所措,任何帮助/想法都很棒!

代码如下:

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
        )

)

【问题讨论】:

  • 这是您代码的真实复制粘贴吗?

标签: php arrays codeigniter object


【解决方案1】:

我猜问题是你每次通过引用get函数中获取同一个对象,然后将它通过引用添加到数组中,导致在 get 函数中修改项目时修改数组中的所有项目。如果是这种情况,以下应该有效:

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

【讨论】:

    【解决方案2】:

    当您将 $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() 是方式:)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-21
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2017-02-23
      • 2014-04-12
      相关资源
      最近更新 更多