用php将对象存储在数组中

Posted

技术标签:

【中文标题】用php将对象存储在数组中【英文标题】:Storing objects in an array with 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
        )

)

【问题讨论】:

这是您代码的真实复制粘贴吗? 【参考方案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 指向的最后一个引用。

【讨论】:

以上是关于用php将对象存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章

php如何序列化对象数组?

将 PHP 对象转换为关联数组

我想在每次单击提交按钮时将对象存储在一个数组中,但是在每个提交按钮之后它将单个对象存储在一个数组中

c++中数组和对象的数据是存储在栈内存还是堆内存?

PHP PHP:创建一个对象数组来存储原子rss数据

如何将对象列表存储在数组中?