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

PHP重构数组结构适配ApexCharts 解决缺失y=0数据问题

问题:补全数组缺失数据以适配ApexCharts

需要将原始数组转换为包含完整日期序列的结构,确保每个系列的data数组包含所有日期,缺失的日期对应y值为0,以满足ApexCharts对完整数据的要求。

原始数组结构

{
  "BANANA": [{
    "x": "01 Jan",
    "y": 1
  }],
  "APPLE": [{
    "x": "02 Jan",
    "y": 1
  }, {
    "x": "03 Jan",
    "y": 1
  }],
  "MANGO": [{
    "x": "04 Jan",
    "y": 1
  }]
}

目标数组结构

{
  "AnalyticData": [{
    "name": "BANANA",
    "data": [{
      "x": "01 Jan",
      "y": 1
    }, {
      "x": "02 Jan",
      "y": 0
    }, {
      "x": "03 Jan",
      "y": 0
    }, {
      "x": "04 Jan",
      "y": 0
    }]
  }, {
    "name": "APPLE",
    "data": [{
      "x": "01 Jan",
      "y": 0
    }, {
      "x": "02 Jan",
      "y": 1
    }, {
      "x": "03 Jan",
      "y": 1
    }, {
      "x": "04 Jan",
      "y": 0
    }]
  }, {
    "name": "MANGO",
    "data": [{
      "x": "01 Jan",
      "y": 0
    }, {
      "x": "02 Jan",
      "y": 0
    }, {
      "x": "03 Jan",
      "y": 0
    }, {
      "x": "04 Jan",
      "y": 1
    }]
  }]
}

尝试的PHP代码及当前输出

尝试代码

foreach ($DataArray as $Data => $Subchild)
{
   $parentDate[] = $Data;
   $AnalyticData[] = $Subchild;

   foreach (array_combine($parentDate, $AnalyticData) as $ChildName => $ChildData)
   {
      $resultData[] = array(
         'name' => $ChildName,
         'data' => $ChildData
      );
   }

}

$UniqueDataAnalytic = array_values(array_unique($resultData, SORT_REGULAR));
$JsonData = array(
   'AnalyticData' => $UniqueDataAnalytic
);

header('Content-type: application/json');
echo json_encode($JsonData);

当前输出

{
  "AnalyticData": [{
    "name": "BANANA",
    "data": [{
      "x": "01 Jan",
      "y": 1
    }]
  }, {
    "name": "APPLE",
    "data": [{
      "x": "02 Jan",
      "y": 1
    }, {
      "x": "03 Jan",
      "y": 1
    }]
  }, {
    "name": "MANGO",
    "data": [{
      "x": "04 Jan",
      "y": 1
    }]
  }]
}

当前输出缺少部分日期对应的y:0数据,导致ApexCharts报错。


解决方案

核心思路是先收集所有出现过的唯一日期,再为每个系列补全缺失日期的y:0条目,步骤如下:

1. 收集所有唯一日期

遍历原始数组的所有子项,提取所有x值并去重,得到完整的日期列表:

// 收集所有唯一日期
$allDates = [];
foreach ($DataArray as $items) {
    foreach ($items as $item) {
        $allDates[] = $item['x'];
    }
}
// 去重并保持原有顺序
$allDates = array_unique($allDates);

2. 处理每个系列,补全缺失数据

对每个水果系列,遍历完整日期列表,检查当前日期是否存在于该系列的数据中,不存在则添加y:0的条目:

$AnalyticData = [];
foreach ($DataArray as $fruitName => $fruitData) {
    // 将当前系列的数据转为以日期为键的数组,方便快速查找
    $existingData = [];
    foreach ($fruitData as $item) {
        $existingData[$item['x']] = $item['y'];
    }
    
    // 构建包含所有日期的完整data数组
    $completeData = [];
    foreach ($allDates as $date) {
        $completeData[] = [
            'x' => $date,
            'y' => isset($existingData[$date]) ? $existingData[$date] : 0
        ];
    }
    
    // 将处理后的系列添加到结果数组
    $AnalyticData[] = [
        'name' => $fruitName,
        'data' => $completeData
    ];
}

3. 生成最终JSON输出

将处理后的数组包装成目标结构并输出:

$JsonData = [
    'AnalyticData' => $AnalyticData
];

header('Content-type: application/json');
echo json_encode($JsonData);

完整代码

// 假设$DataArray是原始输入数组
$DataArray = json_decode('{
  "BANANA": [{
    "x": "01 Jan",
    "y": 1
  }],
  "APPLE": [{
    "x": "02 Jan",
    "y": 1
  }, {
    "x": "03 Jan",
    "y": 1
  }],
  "MANGO": [{
    "x": "04 Jan",
    "y": 1
  }]
}', true);

// 收集所有唯一日期
$allDates = [];
foreach ($DataArray as $items) {
    foreach ($items as $item) {
        $allDates[] = $item['x'];
    }
}
$allDates = array_unique($allDates);

// 处理每个系列补全数据
$AnalyticData = [];
foreach ($DataArray as $fruitName => $fruitData) {
    $existingData = [];
    foreach ($fruitData as $item) {
        $existingData[$item['x']] = $item['y'];
    }
    
    $completeData = [];
    foreach ($allDates as $date) {
        $completeData[] = [
            'x' => $date,
            'y' => isset($existingData[$date]) ? $existingData[$date] : 0
        ];
    }
    
    $AnalyticData[] = [
        'name' => $fruitName,
        'data' => $completeData
    ];
}

// 生成最终JSON
$JsonData = [
    'AnalyticData' => $AnalyticData
];

header('Content-type: application/json');
echo json_encode($JsonData);

运行上述代码后,将得到符合要求的目标结构,每个系列的data数组包含所有日期,缺失日期对应y值为0,可正常适配ApexCharts。


内容的提问来源于stack exchange,提问作者evan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:37:10