php - 如果键不匹配,如何合并多个数组并插入值的总和?
问题描述
我正在寻找将 2 个或更多数组合并到输出数组中以在图形上使用的函数。X 轴(数组键)是日期,Y 是美元(数组值)。有时日期/键可能匹配或不匹配。此外,长度或数组可能不一样。我找到了在键匹配时如何执行此操作的示例:如何对多维数组中的所有列值求和? 但是我想在它们不匹配时对它们进行插值。我把这张图放在一起,作为我试图获得的输入和输出的一个例子。
2 个红色输入数组将是:
$a1 = array(
"2019-01-01" => 0
,"2019-01-15" => 1000
,"2019-02-05" => 2000
,"2019-02-19" => 4000
);
$a2 = array(
"2019-01-22" => 0
,"2019-02-05" => 1000
,"2019-02-12" => 2000
,"2019-02-26" => 3000
);
蓝色输出数组将是:
Array
(
[2019-01-01] => 0
[2019-01-15] => 1000
[2019-01-22] => 1333
[2019-02-05] => 3000
[2019-02-12] => 5000
[2019-02-19] => 6500
[2019-02-26] => 7000
)
我有插值函数工作:
echo getFeeFromDates('2019-1-15', 1000, '2019-2-5', 2000, '2019-1-22');
function getFeeFromDates ($date1, $fee1, $date2, $fee2, $getDate) {
$start = strtotime($date1);
$end = strtotime($date2);
$find = strtotime($getDate);
$days_between = ceil(abs($end - $start) / 86400);
$fee = abs($fee2 - $fee1);
$feePerDay = $fee / $days_between;
$findDays = ceil(abs($find - $start) / 86400);
$myFee = number_format(($feePerDay * $findDays) + $fee1, 2);
return $myFee;
}
这将返回 1333.33 作为 2019-1-22 日期的插值。
我只是在循环多个数组以及何时插入值与仅添加值时遇到麻烦。任何帮助,将不胜感激。
解决方案
您可以创建一个辅助函数,该函数采用一个键/值数组和一个键数组,该函数返回一个键/值数组,该数组将包含第二个数组中的所有键,并在需要时插入值。键数组应该包含第一个数组中存在的所有键,但可以有更多(而不是更少):
function interpolate($a, $keys) {
foreach($keys as $key) {
if (key($a) === $key) {
$prevValue = $result[$key] = current($a);
$prevKey = $key;
next($a);
} else if (empty($prevKey)) {
$result[$key] = 0;
} else {
$result[$key] = current($a) === false ? $prevValue
: $prevValue + (current($a) - $prevValue)
* (strtotime($key) - strtotime($prevKey))
/ (strtotime(key($a)) - strtotime($prevKey));
}
}
return $result;
}
现在有了这个功能,很容易得到想要的结果。假设您有$a1
并且$a2
在您的示例中。然后做:
$keys = array_keys(array_merge($a1, $a2));
sort($keys);
$b1 = interpolate($a1, $keys);
$b2 = interpolate($a2, $keys);
foreach($b1 as $key => $value) {
$sum[$key] = $value + $b2[$key];
}
$sum
会得到想要的结果。
超过 2 个输入数组
当你有一个这样的输入数组的数组时,我们称之为它$a
,然后你可以使用这个代码:
$keys = array_keys(array_merge(...$a));
sort($keys);
$b = array_map(function ($a1) use ($keys) {
return interpolate($a1, $keys);
}, $a);
foreach($keys as $key) {
$sum[$key] = array_sum(array_column($b, $key));
}
推荐阅读
- python - Python Pandas 按多列分组并追加
- swift - Swift:跟踪用户的分数
- reactjs - 根据在 React 中使用钩子选择的复选框过滤对象数组以呈现项目
- c# - 添加静态列
- r - 使用循环根据列拆分数据集
- phpstorm - PhpStorm 在专注于另一个应用程序之前不会检测到文件更改
- jmeter - 为什么即使在所有配置都正确完成后,在Firefox中通过JMeter录制脚本时页面内容也没有加载?
- node.js - NodeJS 终止错误的差异
- reactjs - 反应嵌套路由器未正确渲染
- python - 我们如何根据python中的多个参数对对象列表进行排序