Php合并对象数组错误地仅合并最后的值

时间:2015-09-22 16:22:48

标签: php arrays merge

我正在尝试按如下方式从数据库合并一个对象,如下所示:

$pooldetails = array();
$qstncount = 5;

for($i=0;$i<$qstncount;$i++){

        $stdClass = $DB->get_record_sql("SELECT * FROM {pool_objective} po WHERE (po.id = $randarray[$i])");    
        $pooldetails = (object) array_merge((array) $pooldetails, (array) $stdClass);
}

当我在外面打印时如下:

print_r($pooldetails);

我只获得此数组中的最后一个值。我的意思是$qstncoun=4的价值。缺少前4个值。我做错了什么?

1 个答案:

答案 0 :(得分:1)

实际上是预料到的。引用the docs

  

如果输入数组具有相同的字符串键,则后面的值   该密钥将覆盖前一个密钥。

要结合使用结果,请改用array_merge_recursive()

$arr1 = ['a' => 1];
$arr2 = ['a' => 2];
var_dump(array_merge($arr1, $arr2));
// ['a' => 2]
var_dump(array_merge_recursive($arr1, $arr2)); 
// ['a' => [1, 2]]

但请注意以下事项:

  

如果输入数组具有相同的字符串键,则为其值   这些键合并到一个数组中,这样就完成了   递归地,如果其中一个值是一个数组本身,那么   函数将它与另一个数组中的相应条目合并   太。 但是,如果数组具有相同的数字键,则后者   值不会覆盖原始值,但会被追加。

然而,在您的情况下,因为键映射到列名称可能并不重要。所以你可以使用类似的东西......

$pooldetails = array();
$qstncount = 5;
for($i=0;$i<$qstncount;$i++){
   $stdClass = $DB->get_record_sql("SELECT * FROM {pool_objective} po WHERE (po.id = $randarray[$i])");    
   $pooldetails = array_merge_recursive($pooldetails, (array) $stdClass);
}
$pooldetails = (object) $pooldetails;