Эффективный способ уменьшения многомерного массива

У меня есть следующий массив, который нужно уменьшить с внутренней суммой значений

0 => array:116 [
121 => array:3 [
"number" => 121
"name" => "Some Name 1""value" => "2.222"]
116 => array:3 [
"number" => 116
"name" => "Some Name 2""value" => "1.111"]
1 => array:3 [
"number" => 1
"name" => "Some Name 3""value" => "1.232"]
]
1 => array:116 [
121 => array:3 [
"number" => 121
"name" => "Some Name 1""value" => "1.111"]
116 => array:3 [
"number" => 116
"name" => "Some Name 2""value" => "2.222"]
1 => array:3 [
"number" => 1
"name" => "Some Name 3""value" => "3.111"]
]

должен выглядеть так

0 => array:116 [
121 => array:3 [
"number" => 121
"name" => "Some Name 1""value" => "3.333"]
116 => array:3 [
"number" => 116
"name" => "Some Name 2""value" => "3.333"]
1 => array:3 [
"number" => 1
"name" => "Some Name 3""value" => "4.343"]
]

каким будет эффективный / эффективный способ вычисления результирующего массива на основе входных данных, при условии, что длина входного массива не определена, но уровень сложности / вложенности равен максимум 2.

что будет иметь оптимальное решение для PHP 5.6 и PHP 7+

0

Решение

Я обновил функционал, чтобы иметь возможность брать много детей. В ответе, который я связал два, я добавил дополнительного потомка к ключу массива 0 и 1.

// Merege $a[0] and $a[1] and sum up the `value` key

$merge_sum = array_map(function($key, ...$a) {
$merged = array_merge(...$a);
$merged['value'] = array_sum(array_column($a, 'value'));
return [ $key => $merged ];
}, array_keys($a[0]), ...$a);

// // Fix array array keys

$final = array_reduce($merge_sum, function($c, $i) {
$concat = $c + $i;
return $concat;
}, []);

var_dump($final);

Проверьте это на этом репле; https://repl.it/Id7T/6

0

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

Из вашего примера входного массива видно, что все numbers представлены в каждом подмассиве (121, 116, 1). Если это не относится к вашему реальному проекту, пожалуйста, обновите ваш вопрос с более точными / реалистичными образцами данных.

Мой метод дважды обрезает многомерный массив, чтобы сначала изолировать столбцы баз данных на числовых ключах, а во-вторых — value элемент в выборе с одинаковым ключом.

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

$array = [
[
121 => [ "number" => 121, "name" => "Some Name 1", "value" => "2.222" ],
116 => [ "number" => 116, "name" => "Some Name 2", "value" => "1.111" ],
1 => [ "number" =>   1, "name" => "Some Name 3", "value" => "1.232" ]
],
[
121 => [ "number" => 121, "name" => "Some Name 1", "value" => "1.111" ],
116 => [ "number" => 116, "name" => "Some Name 2", "value" => "2.222" ],
1 => [ "number" =>   1, "name" => "Some Name 3", "value" => "3.111" ]
]
];

$all_numbers=array_keys($array[0]);  // generate a 1-dim array of `number` values
foreach($all_numbers as $number){
$array[0][$number]['value']=array_sum(array_column(array_column($array,$number),'value'));
}
$array=[$array[0]];  // only keep the first subarray's data

var_export($array);

Выход:

array (
0 =>
array (
121 =>
array (
'number' => 121,
'name' => 'Some Name 1',
'value' => 3.333,
),
116 =>
array (
'number' => 116,
'name' => 'Some Name 2',
'value' => 3.333,
),
1 =>
array (
'number' => 1,
'name' => 'Some Name 3',
'value' => 4.343,
),
),
)
0

По вопросам рекламы [email protected]