我正在尝试按如下方式从数据库合并一个对象,如下所示:
$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个值。我做错了什么?
答案 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;