减少多维数组的有效方法
Efficient way of reducing multidimensional array
我有以下数组需要用内部值总和来减少
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"
]
]
假设输入数组的长度未定义,但 complexity/nesting 级别最大为 2,根据输入计算结果数组的 efficient/effective 方法是什么。
优化解决方案对 PHP 5.6 和 PHP 7+
有何影响
我更新了功能,以便能够占用很多 children。在 repl 中,我链接了两个,我向数组键的 0 和 1 添加了一个额外的 child。
// 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);
在这个repl上测试一下; https://repl.it/Id7T/6
从您的示例输入数组看来,所有 numbers
都在每个子数组(121
、116
、1
)中表示。如果您的实际项目并非如此,请使用更多 accurate/realistic 样本数据更新您的问题。
我的方法"cuts down"通过两次多维数组首先根据数字键隔离数据库的列,然后在like-keyed选择中隔离value
元素。
代码:(Demo)
$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 => 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"
]
]
假设输入数组的长度未定义,但 complexity/nesting 级别最大为 2,根据输入计算结果数组的 efficient/effective 方法是什么。
优化解决方案对 PHP 5.6 和 PHP 7+
有何影响我更新了功能,以便能够占用很多 children。在 repl 中,我链接了两个,我向数组键的 0 和 1 添加了一个额外的 child。
// 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);
在这个repl上测试一下; https://repl.it/Id7T/6
从您的示例输入数组看来,所有 numbers
都在每个子数组(121
、116
、1
)中表示。如果您的实际项目并非如此,请使用更多 accurate/realistic 样本数据更新您的问题。
我的方法"cuts down"通过两次多维数组首先根据数字键隔离数据库的列,然后在like-keyed选择中隔离value
元素。
代码:(Demo)
$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,
),
),
)