PHP二维数组差值计算:保留年月键的实现方法求助
PHP关联数组按年月键做差值计算的实现方案
我来帮你解决这个问题,其实核心就是利用PHP关联数组的键(也就是你的年月字符串)来匹配对应的值进行运算,同时完整保留这些键。下面是具体的实现步骤和代码:
首先,先把你的原始数组明确出来:
// 第一个数组(被减数) $arr1 = [ "2018-05" => "15", "2018-06" => "100" ]; // 第二个数组(减数) $arr2 = [ "2018-05" => "5" ];
方法一:兼容所有可能的键(包含两个数组的所有年月)
这个方法会处理两个数组中出现的所有年月键,不管它只在某一个数组里存在:
// 获取两个数组的所有唯一键(确保不遗漏任何年月) $allKeys = array_unique(array_merge(array_keys($arr1), array_keys($arr2))); $result = []; foreach ($allKeys as $yearMonth) { // 将字符串值转为整数,避免字符串运算的潜在问题 $value1 = isset($arr1[$yearMonth]) ? (int)$arr1[$yearMonth] : 0; $value2 = isset($arr2[$yearMonth]) ? (int)$arr2[$yearMonth] : 0; // 计算差值后转回字符串,和原始数组的类型保持一致 $result[$yearMonth] = (string)($value1 - $value2); } // 输出结果 print_r($result);
运行后你会得到想要的结果:
Array ( [2018-05] => 10 [2018-06] => 100 )
方法二:仅保留第一个数组的键(更贴合你的示例场景)
如果你的需求是只保留第一个数组里的年月键(也就是只计算第一个数组存在的项),可以简化代码:
$result = []; foreach ($arr1 as $yearMonth => $value1) { $value2 = isset($arr2[$yearMonth]) ? (int)$arr2[$yearMonth] : 0; $result[$yearMonth] = (string)((int)$value1 - $value2); } print_r($result);
这个代码同样能得到你期望的输出,因为当第二个数组没有对应键时,我们默认减数为0,自然就保留了第一个数组的原始值。
关键要点说明
- 利用
array_keys()获取数组的年月键,通过array_merge()和array_unique()确保所有键都被覆盖 - 用
isset()检查键是否存在,避免出现「Undefined index」的错误 - 显式将字符串值转为整数计算,比直接用字符串减法更安全可靠
- 最后转回字符串类型,和你原始数组的值类型保持一致
内容的提问来源于stack exchange,提问作者Yen
相关产品推荐
相关产品推荐

