减少多维数组的有效方法

时间:2017-06-09 01:00:25

标签: php arrays algorithm multidimensional-array reduce

我有以下数组需要使用内部值sum

进行减少
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 +

,将会有什么重要的解决方案

2 个答案:

答案 0 :(得分:2)

从您的示例输入数组中可以看出,所有numbers都表示在每个子数组中(1211161)。如果您的实际项目不适用,请使用更准确/更真实的样本数据更新您的问题。

我的方法通过多维数组“减少”两次,首先在数字键上隔离数据库列,然后在类似键控选择中隔离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,
    ),
  ),
)

答案 1 :(得分:0)

我更新了功能,可以带很多孩子。在repl中,我链接了两个,我在数组键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);

在此repl上测试它; https://repl.it/Id7T/6