用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将对象存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章