合并日期匹配的2个数组/对象,并插入非匹配

时间:2016-03-04 20:50:31

标签: php arrays multidimensional-array

我有2个数据库对象,可以随时提供数据。但结果并不一定具有相同的日期。用户可以在一天输入他们的体重,或者在同一天输入体脂,或者在同一天输入两者。

weight_history
日期 - 金额
2016年3月2日星期三 - 194.00
2016年3月3日星期三 - 205.40

bodyfat_history
日期 - 金额
2016年3月1日星期三 - 24.80
2016年3月2日星期三 - 22.80

我想要绘制这些数据的图形,因此我需要合并匹配的日期,然后在剩下的值中将它们归零。

我未能掌握的逻辑是如何添加其他逻辑以获得完整的数据集。

这是我的代码,用于合并数据并获取剩余的权重结果。什么是添加不匹配的bodyfat结果的最佳方式。如果我在嵌套循环中执行它们,数据将被多次添加。

foreach(array_reverse($weight_history->result()) as $row):
    foreach(array_reverse($bodyfat_history->result()) as $row2):
        if(date("F j, Y", $row->date) == date("F j, Y", $row2->date)){
            $results[date("F j, Y", $row->date)]['weight'] = $row->amount;
            $results[date("F j, Y", $row->date)]['bodyfat'] = $row2->amount;
        }
        $results[date("F j, Y", $row->date)]['weight'] = $row->amount;
    endforeach;
endforeach;

这是我追求的结果集。

日期 - 体重 - 体脂 2016年3月1日星期三 - 空 - 24.80
2016年3月2日星期三 - 194.00 - 22.80
2016年3月3日星期三 - 205.40 - Null

1 个答案:

答案 0 :(得分:1)

您不需要嵌套循环,请尝试:

foreach($weight_history->result() as $row)
    $results[date("F j, Y", $row->date)]['weight'] = $row->amount;
foreach($bodyfat_history->result() as $row)
    $results[date("F j, Y", $row->date)]['bodyfat'] = $row->amount;

如果您不想看到警告:

$results = array();
foreach($weight_history->result() as $row) {
    if (!isset($results[date("F j, Y", $row->date)])) $results[date("F j, Y", $row->date)] = array('bodyfat'=>null);
    $results[date("F j, Y", $row->date)]['weight'] = $row->amount;
}
foreach($bodyfat_history->result() as $row) {
    if (!isset($results[date("F j, Y", $row->date)])) $results[date("F j, Y", $row->date)] = array('weight'=>null);
    $results[date("F j, Y", $row->date)]['bodyfat'] = $row->amount;
}