按new_date合并两数组为第三数组,缺失值补0的实现咨询
解决方案:按
new_date合并两个数组,缺失字段补0 嘿,我完全懂你遇到的困扰——想把两个分别带data和data1的数组合并,每个日期条目里必须同时有这两个字段,没有的就填0。之前试的array_merge和array_combine确实搞不定,这俩函数的设计本来就不是干这个活的。咱们可以用下面这个思路来实现你的需求:
核心思路
- 先把两个数组转换成以
new_date为键的关联数组,这样后续查找对应日期的值会非常高效; - 收集所有出现过的日期,确保不遗漏任何一方的条目;
- 按日期排序(和你期望的结果顺序一致);
- 遍历每个日期,组装包含
new_date、data、data1的条目,缺失的字段直接设为0。
完整代码示例
// 你的原始数组(补全了语法闭合) $array1 = [ ["data" => 118, "new_date" => "06-2017"], ["data" => 263, "new_date" => "07-2017"], ["data" => 264, "new_date" => "08-2017"], ["data" => 266, "new_date" => "09-2017"], ["data" => 306, "new_date" => "10-2017"], ["data" => 100, "new_date" => "11-2017"], ]; $array2 = [ ["data1" => 100, "new_date" => "02-2016"], ["data1" => 170, "new_date" => "06-2017"], ["data1" => 354, "new_date" => "07-2017"], ["data1" => 397, "new_date" => "08-2017"], ["data1" => 421, "new_date" => "09-2017"], ["data1" => 531, "new_date" => "10-2017"], ]; // 步骤1:将数组转为以new_date为键的关联数组 $array1Keyed = []; foreach ($array1 as $item) { $array1Keyed[$item['new_date']] = $item['data']; } $array2Keyed = []; foreach ($array2 as $item) { $array2Keyed[$item['new_date']] = $item['data1']; } // 步骤2:收集所有不重复的日期 $allDates = array_unique(array_merge(array_keys($array1Keyed), array_keys($array2Keyed))); // 步骤3:按日期排序(保证结果按时间顺序排列) usort($allDates, function($a, $b) { $dateA = DateTime::createFromFormat('m-Y', $a); $dateB = DateTime::createFromFormat('m-Y', $b); return $dateA <=> $dateB; }); // 步骤4:组装最终的合并数组 $array3 = []; foreach ($allDates as $date) { $array3[] = [ "new_date" => $date, "data" => $array1Keyed[$date] ?? 0, // 空合并运算符,PHP7+可用 "data1" => $array2Keyed[$date] ?? 0, ]; } // 输出结果 print_r($array3);
代码说明
- 用
foreach把原始数组转成日期为键的数组,这样后续查找值只需要O(1)的时间,比循环遍历查找高效得多; array_unique+array_merge确保我们拿到所有出现过的日期,不会漏掉任何一个条目;usort配合DateTime实现日期的正确排序,保证结果和你期望的时间顺序一致;- 使用PHP7+的空合并运算符
??,可以简洁地处理“存在就用值,不存在就设0”的逻辑,比isset判断更简洁。
为什么之前的函数不行?
array_merge只是简单地把两个数组的元素拼接在一起,不会根据new_date去匹配合并条目;array_combine要求两个数组的长度完全相同,并且是用第一个数组的元素当键、第二个数组的元素当值,完全不符合我们按日期合并的需求。
内容的提问来源于stack exchange,提问作者N30FOX
相关产品推荐
相关产品推荐

