Для достижения желаемого эффекта вам нужно будет повторять массив по два элемента за раз. Это не может быть легко сделано с 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>";
}
Это должно дать вам желаемый результат.
14-02-2020 - 110 - Diff is -4 from Previous Date
13-02-2020 - 114 - Diff is +2 from Previous Date
12-02-2020 - 112 - Diff is +2 from Previous Date
11-02-2020 - 110 - Diff is +5 from Previous Date
10-02-2020 - 105 - Diff is -20 from Previous Date
07-02-2020 - 125 - Diff is +13 from Previous Date
12-02-2020 - 112 - Diff is -10 from Previous Date
06-02-2020 - 122 - Diff is +4 from Previous Date
05-02-2020 - 118 - Diff is -1 from Previous Date
04-02-2020 - 119 - Diff is 0 from Previous Date
03-02-2020 - 119 - Diff is 0 from Previous Date
NB
Технически говоря, вы фактически не получаете разницу между текущей датой и предыдущей датой, Вот. Скорее, вы получаете разницу между текущей датой и следующей датой. Если вы получали дельты между предыдущими датами, вам вообще не понадобилась бы информация со следующей даты. Вместо этого вы бы просто использовали временную переменную для хранения последнего значения density
и сравнивали его с каждой итерацией. Тем не менее, я адаптировал свой ответ к ожидаемому результату.
В противном случае ожидаемый результат будет на самом деле:
14-02-2020 - 110 - Diff is +110 from Previous Date
13-02-2020 - 114 - Diff is +4 from Previous Date
12-02-2020 - 112 - Diff is -2 from Previous Date
11-02-2020 - 110 - Diff is -2 from Previous Date
10-02-2020 - 105 - Diff is -5 from Previous Date
07-02-2020 - 125 - Diff is +20 from Previous Date
12-02-2020 - 112 - Diff is -13 from Previous Date
06-02-2020 - 122 - Diff is +10 from Previous Date
05-02-2020 - 118 - Diff is -4 from Previous Date
04-02-2020 - 119 - Diff is +1 from Previous Date
03-02-2020 - 119 - Diff is 0 from Previous Date
И для достижения этого вам не нужно Генератор реализации я использовал вообще. Вы можете просто сделать это с помощью обычного foreach
l oop, например, так:
$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
}