如何合并长度不同的多维数组?按共同键整合补全缺失值
问题
我有两个多维数组,希望通过共同键formatted_day合并为一个数组。问题是根据SQL查询结果,任意一个数组都可能缺少该键。我尝试过array_merge_recursive、array_combine及多种循环,但都未能解决。
示例数组1(销售数据)
array ( 0 => array ( 'Sunday' => array ( 'sales' => 0.34, ), ), 1 => array ( 'Monday' => array ( 'sales' => 0.1, ), ), 2 => array ( 'Wednesday' => array ( 'sales' => 0.1, ), ), 3 => array ( 'Friday' => array ( 'sales' => 0.09, ), ), 4 => array ( 'Saturday' => array ( 'sales' => 0.37, ), ), )
示例数组2(预算数据)
array ( 0 => array ( 'Sunday' => array ( 'budget' => 0.26, ), ), 1 => array ( 'Monday' => array ( 'budget' => 0.11, ), ), 2 => array ( 'Tuesday' => array ( 'budget' => 0.0, ), ), 3 => array ( 'Wednesday' => array ( 'budget' => 0.14, ), ), 4 => array ( 'Thursday' => array ( 'budget' => 0.0, ), ), 5 => array ( 'Friday' => array ( 'budget' => 0.17, ), ), 6 => array ( 'Saturday' => array ( 'budget' => 0.32, ), ), )
期望结果
需要生成如下格式的数组,销售数组中缺失的日期需补为0:
array ( 0 => array ( 'Sunday' => array ( 'budget' => 0.26, 'sales' => 0.34), ), 1 => array ( 'Monday' => array ( 'budget' => 0.11, 'sales' => 0.1), ), 2 => array ( 'Tuesday' => array ( 'budget' => 0.0, 'sales' => 0), ), 3 => array ( 'Wednesday' => array ( 'budget' => 0.14, 'sales' => 0.1), ), 4 => array ( 'Thursday' => array ( 'budget' => 0.0, 'sales' => 0), ), 5 => array ( 'Friday' => array ( 'budget' => 0.17, 'sales' => 0.09), ), 6 => array ( 'Saturday' => array ( 'budget' => 0.32, 'sales' => 0.37), ), )
尝试过的代码及问题
尝试1:使用array_merge_recursive
$combined = array_merge_recursive($salesPerDay2, $budgetPerDay); $keys = array_keys($combined); for($i = 0; $i < count($combined); $i++) { echo $keys[$i] . "{<br>"; foreach($combined[$keys[$i]] as $key => $value) { echo $key . " : " . $value . "<br>"; } echo "}<br>"; }
得到的结果是日期重复,未合并到同一数组下:
0{ formatted_date : Sunday dailySales : 0.34 } 1{ formatted_date : Monday dailySales : 0.1 } 2{ formatted_date : Wednesday dailySales : 0.1 } 3{ formatted_date : Friday dailySales : 0.09 } 4{ formatted_date : Saturday dailySales : 0.37 } 5{ formatted_date : Sunday dailyBudget : 0.26 } 6{ formatted_date : Monday dailyBudget : 0.11 }
尝试2:使用array_combine
$combined = array_combine($salesPerDay2, $budgetPerDay); var_dump($combined);
直接报错,因两个数组元素数量不一致:
Fatal error: Uncaught ValueError: array_combine(): Argument #1 ($keys) and argument #2 ($values) must have the same number of elements in C:\xampp\htdocs\test.php on line 287
解决方案
核心思路是先将两个数组转换为以日期为键的关联数组,方便按日期键合并,最后再转换成目标索引数组格式。
基础实现代码
// 假设$salesArray是示例数组1,$budgetArray是示例数组2 // 转换销售数组为[日期 => 销售额]的关联数组 $salesMap = []; foreach ($salesArray as $item) { $day = key($item); $salesMap[$day] = $item[$day]['sales']; } // 转换预算数组为[日期 => 预算额]的关联数组 $budgetMap = []; foreach ($budgetArray as $item) { $day = key($item); $budgetMap[$day] = $item[$day]['budget']; } // 以预算数组的日期为基准合并,缺失的销售额补0 $combined = []; foreach ($budgetMap as $day => $budget) { $sales = $salesMap[$day] ?? 0; $combined[] = [ $day => [ 'budget' => $budget, 'sales' => $sales ] ]; } // 输出结果 var_export($combined);
兼容双向缺失的扩展代码
如果销售数组可能包含预算数组没有的日期,可先获取所有日期集合再合并:
// 获取所有日期的集合 $allDays = array_unique(array_merge(array_keys($salesMap), array_keys($budgetMap))); // 按星期顺序排序(保证输出顺序符合预期) $weekOrder = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; usort($allDays, function($a, $b) use ($weekOrder) { return array_search($a, $weekOrder) - array_search($b, $weekOrder); }); // 合并数组,双向缺失的数值都补0 $combined = []; foreach ($allDays as $day) { $budget = $budgetMap[$day] ?? 0; $sales = $salesMap[$day] ?? 0; $combined[] = [ $day => [ 'budget' => $budget, 'sales' => $sales ] ]; }
内容的提问来源于stack exchange,提问作者user3069332
相关产品推荐
相关产品推荐

