要达到预期的效果,您需要一次迭代数组两个元素。使用foreach 完全不能轻易做到这一点。因此,我将实现一个生成器,它一次从数组中返回成对的值。
function getPairs(Array $array) {
reset($array);
do {
$a1 = current($array);
$key = key($array);
$a2 = next($array);
yield [$a1, $a2];
} while($key = key($array) !== null);
}
然后你可以使用这个生成器实现来遍历数组,达到预期的效果。
$array = [
["date" => "14-02-2020", "density" => 110],
["date" => "13-02-2020", "density" => 114],
["date" => "12-02-2020", "density" => 112],
["date" => "11-02-2020", "density" => 110],
["date" => "10-02-2020", "density" => 105],
["date" => "07-02-2020", "density" => 125],
["date" => "12-02-2020", "density" => 112],
["date" => "06-02-2020", "density" => 122],
["date" => "05-02-2020", "density" => 118],
["date" => "04-02-2020", "density" => 119],
["date" => "03-02-2020", "density" => 119],
];
foreach(getPairs($array) as [$a, $b]) {
// We must check if $b is empty to account for end of the array
if ($b) {
$diff = $a["density"] - $b["density"];
} else { // Otherwise there are no more elements to diff against
$diff = 0;
}
if ($diff > 0) {
$diff = "+$diff";
}
echo "{$a['date']} - {$a['density']} - Diff is $diff from Previous Date<br><br>";
}
这应该会给你想要的输出。
2020 年 2 月 14 日 - 110 - 与上一个日期的差异为 -4
2020 年 2 月 13 日 - 114 - 与上一个日期的差异为 +2
2020 年 2 月 12 日 - 112 - 与上一个日期的差异为 +2
2020 年 11 月 2 日 - 110 - 与上一个日期的差异为 +5
2020 年 2 月 10 日 - 105 - 与上一个日期的差异为 -20
2020 年 7 月 2 日 - 125 - 与上一个日期的差异为 +13
2020 年 2 月 2 日 - 112 - 与上一个日期的差异为 -10
2020 年 6 月 2 日 - 122 - 与上一个日期的差异为 +4
2020 年 5 月 2 日 - 118 - 与上一个日期的差异为 -1
04-02-2020 - 119 - 与上一个日期的差异为 0
03-02-2020 - 119 - 与上一个日期的差异为 0
注意
从技术上讲,您实际上并没有在这里得到当前日期和上一个日期之间的差异。相反,您得到的是当前日期和下一个日期之间的差异。如果您获得了先前日期之间的增量,则根本不需要下一个日期的信息。相反,您只需使用一个临时变量来存储最后一个 density 值,并在每次迭代时对其进行比较。不过,我已根据您的预期结果调整了答案。
否则预期的输出实际上是:
2020 年 2 月 14 日 - 110 - 与上一个日期的差异为 +110
2020 年 2 月 13 日 - 114 - 与上一个日期的差异为 +4
2020 年 12 月 2 日 - 112 - 与上一个日期的差异为 -2
2020 年 11 月 2 日 - 110 - 与上一个日期的差异为 -2
2020 年 2 月 10 日 - 105 - 与上一个日期的差异为 -5
2020 年 7 月 2 日 - 125 - 与上一个日期的差异为 +20
2020 年 2 月 2 日 - 112 - 与上一个日期的差异为 -13
2020 年 6 月 2 日 - 122 - 与上一个日期的差异为 +10
2020 年 5 月 2 日 - 118 - 与上一个日期的差异为 -4
2020 年 4 月 2 日 - 119 - 与上一个日期的差异为 +1
03-02-2020 - 119 - 与上一个日期的差异为 0
为了实现这一点,您根本不需要我使用的生成器实现。您可以简单地使用常规的foreach 循环来执行此操作,如下所示:
$lastDiff = 0; // Initialize the diff to 0
foreach($array as $a) {
$date = $a['date'];
$density = $a['density'];
$diff = $a["density"] - $lastDiff; // diff against the last known value
if ($diff > 0) {
$diff = "+$diff";
}
echo "$date - $density - Diff is $diff from Previous Date<br><br>";
$lastDiff = $a["density"]; // store the last known density here for the next iteration
}