You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并长度不同的多维数组?按共同键整合补全缺失值

问题

我有两个多维数组,希望通过共同键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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:42:50