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
相关产品推荐
相关产品推荐

