PHP多维数组生成按年月归档的Y-m-d.json文件问题求助
修正PHP日志归档JSON文件的代码实现
你当前的archiveJSON()函数问题出在遍历过程中没有精准提取单日期的分组数据,而是将整个多维日志数组写入了每个文件。下面是完全匹配需求的修正代码:
function archiveJSON(array $logData): void { // 遍历年份维度 foreach ($logData as $year => $months) { // 遍历月份维度 foreach ($months as $month => $days) { // 构建年/月目录路径 $dirPath = "{$year}/{$month}"; // 递归创建多级目录(不存在则创建) if (!is_dir($dirPath)) { mkdir($dirPath, 0755, true); } // 核心遍历:处理每个日期的独立分组数据 foreach ($days as $date => $groupData) { $filePath = "{$dirPath}/{$date}.json"; $existingData = []; // 读取已存在的文件数据 if (file_exists($filePath)) { $jsonContent = file_get_contents($filePath); // 解析失败时 fallback 为空数组 $existingData = json_decode($jsonContent, true) ?: []; } // 合并新旧数据:递归合并分组(如需覆盖相同分组,替换为array_merge) $mergedData = array_merge_recursive($existingData, $groupData); // 写入格式化后的JSON文件 file_put_contents($filePath, json_encode($mergedData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); } } } }
关键修正说明
- 单日期数据提取:最内层循环直接遍历每个月份下的日期集合,每次仅处理当前日期对应的分组数据,彻底解决“全部数据写入每个文件”的问题
- 目录自动创建:通过
mkdir的第三个参数true递归创建年/月目录,无需手动提前创建目录 - 数据合并策略:使用
array_merge_recursive实现分组数据的深度合并;如果需求是相同分组名直接覆盖原有数据,将其替换为array_merge即可 - JSON优化:添加
JSON_PRETTY_PRINT让生成的JSON文件更易读,JSON_UNESCAPED_UNICODE确保中文等特殊字符正常存储
内容的提问来源于stack exchange,提问作者Cem Firat
相关产品推荐
相关产品推荐

