У меня есть динамический многомерный массив, как это:
$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);
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,
),
)
Других решений пока нет …