Итерация массива массивов в обратном порядке и вычитание следующих значений подмассива из текущих значений подмассива

У меня есть динамический многомерный массив, как это:

$myarray = array(
array(
0 => 0,
1 => 70,
2 => 19,
3 => 0
),
array(
0 => 0,
1 => 24,
2 => 14
),
array(
0 => 0,
1 => 15,
2 => 11,
3 => 0
),
array(
0 => 0,
1 => 15,
2 => 27,
3 => 0
)
);

Мне нужно перебрать подмассивы и перезаписать текущие значения каждого подмассива, чтобы представить разницу между исходным значением и следующим значением по отношению к ключам подмассива.

Это описывает требуемую арифметику для каждого элемента подмассива (значение после = это новое желаемое значение):

$myarray = array(
array(
0 => 0 - 0 = 0
1 => 70 - 24 = 46
2 => 19 - 30 = -11
3 => 0 - 0 = 0
),
array(
0 => 0 - 0 = 0
1 => 24 - 0 = 24
2 => 14 -(-16) = 30
3 => 0 - 0 = 0
),
array(
0 => 0 - 0 = 0
1 => 15 - 15 = 0
2 => 11 - 27 = -16
3 => 0 - 0 = 0
),
array(
0 => 0,
1 => 15,
2 => 27,
3 => 0
)
);

Я пытался что-то сделать, но это не то, что мне нужно, и он содержит ошибки:

$new_array = array();
foreach($myarray as $key => $values) {
foreach($values as $k_key => $v_values) {
$calc = $values[$k_key+1]-$v_values;
array_push($new_array , $calc);
}
}
var_dump($new_array);

0

Решение

YIKES, моя предыдущая попытка повторялась в неправильном порядке! Это правильный путь (первый), затем мой предыдущий неправильный путь, второй.

Код: (демонстрация)

$myarray = [
[0, 70, 19, 0],
[0, 24, 14],        // note missing 4th element
[0, 15, 11, 0],
[0, 15, 27, 0]
];

for ($i = sizeof($myarray)-2; $i>=0; --$i) {                   // start from 2nd last subarray, and move toward the start
$max = max(sizeof($myarray[$i]), sizeof($myarray[$i+1]));  // make sure all elements are accounted for
for($k = 0; $k < $max; ++$k) {                             // iterate and perform subtractions / declarations
$myarray[$i][$k] = (isset($myarray[$i][$k]) ? $myarray[$i][$k] : 0) - (isset($myarray[$i+1][$k]) ? $myarray[$i+1][$k] : 0); // declare/overwrite new values as encountered
}
}

var_export($myarray);

Выход:

array (
0 =>
array (
0 => 0,
1 => 46,
2 => -11,
3 => 0,
),
1 =>
array (
0 => 0,
1 => 24,
2 => 30,
3 => 0,
),
2 =>
array (
0 => 0,
1 => 0,
2 => -16,
3 => 0,
),
3 =>
array (
0 => 0,
1 => 15,
2 => 27,
3 => 0,
),
)

Поскольку вам необходимо учитывать подмассивы переменного размера, проверьте, сколько итераций вам нужно. В основном isset используется повсеместно, чтобы убедиться, что элемент существует, прежде чем пытаться получить к нему доступ.


(здесь начинается неправильный метод. Я оставлю его на тот случай, если кто-то захочет сделать нечто подобное, начиная с передней части массива.)

Код: (демонстрация)

foreach($myarray as $k => $values) {
if (isset($myarray[$k+1])) {
$max = max(sizeof($values), sizeof($myarray[$k+1]));
for($i = 0; $i < $max; ++$i) {
$result[$k][$i] = (isset($values[$i]) ? $values[$i] : 0) - (isset($myarray[$k+1][$i]) ? $myarray[$k+1][$i] : 0);
}
} else {
$result[$k] = $values;
}
}
var_export($result);

Выход:

array (
0 =>
array (
0 => 0,
1 => 46,
2 => 5,
3 => 0,
),
1 =>
array (
0 => 0,
1 => 9,
2 => 3,
3 => 0,
),
2 =>
array (
0 => 0,
1 => 0,
2 => -16,
3 => 0,
),
3 =>
array (
0 => 0,
1 => 15,
2 => 27,
3 => 0,
),
)
2

Другие решения

Других решений пока нет …