【问题标题】:PHP Unique/SUM/Merge array operationsPHP Unique/SUM/Merge 数组操作
【发布时间】:2012-12-21 19:10:51
【问题描述】:

这很难用语言解释,但基本上我需要取两个数组,将它们与唯一值合并,并对其中一个列求和。写在下面会更有意义:

$a = array(
   0 => array(
      'ID' => 1,
      'Count' => 2
   ),
);

$b = array(
   0 => array(
      'ID' => 1,
      'Count' => 4,
   ),
   1 => array(
      'ID' => 2,
      'Count' => 3,
   ),
);

我需要最终产品是:

$a_plus_b = array(
    0 => array(
       'ID' => 1,
       'Count' => 6,
    ),
    1 => array(
       'ID' => 2,
       'Count' => 3,
    ),        
);

我一直在使用 array_merge() 和 array_unique() 的不同变体,但我找不到 高效 的方法来做我需要的事情。我知道我总是可以做嵌套循环,但我希望能做一些更简单的事情。有什么想法吗?

【问题讨论】:

    标签: php arrays merge unique


    【解决方案1】:

    这应该可以解决问题

    注意:此解决方案需要 PHP >= 5.3。下面有一个 PHP

    $input = array($a, $b);
    // add as many result arrays to $input as you want; e.g.,
    // $input = array($a, $b, $c, $d);
    
    $output = array_count_values(
      call_user_func_array(
        'array_merge',
         array_map(
           function($arr) {
             return array_fill(0, $arr['Count'], $arr['ID']);
           },
           call_user_func_array(
             'array_merge',
             $input
           )
         )
      )
    );
    
    print_r($output);
    

    输出

    Array
    (
        [1] => 6
        [2] => 3
    )
    

    注意上面的数组键是ID 值。数组值为Count 值。


    如果您正在运行 PHP < 5.2,您将无法将内联闭包与 array_fill 一起使用。您必须将其定义为单独的函数。

    $input = array($a, $b);
    
    function _fill($arr) {
      return array_fill(0, $arr['Count'], $arr['ID']);
    }
    
    $output = array_count_values(
      call_user_func_array(
        'array_merge',
        array_map(
          '_fill',
          call_user_func_array(
            'array_merge',
            $input
          )
        )
      )
    );
    
    print_r($output);
    

    从这里开始,将输出转换为您想要的格式是一项微不足道的任务。

    【讨论】:

      【解决方案2】:

      请不要过度设计这样的基本任务。使用单个循环迭代两个数组并使用 ID 值分配临时键。如果多次遇到相应的ID 键,只需将新的Count 值添加到存储的值中即可。

      代码:(Demo)

      $result = [];
      foreach (array_merge($a, $b) as $row) {
          if (!isset($result[$row['ID']])) {
              $result[$row['ID']] = $row;
          } else {
              $result[$row['ID']]['Count'] += $row['Count'];
          }
      }
      var_export(array_values($result));
      

      输出:

      array (
        0 => 
        array (
          'ID' => 1,
          'Count' => 6,
        ),
        1 => 
        array (
          'ID' => 2,
          'Count' => 3,
        ),
      )
      

      也可以使用函数式编程来获得相同的结果——array_reduce() 是理想的,因为输出中的元素数量将等于或小于输入数据中的元素数量。

      代码:(Demo)

      var_export(
          array_values(
              array_reduce(
                  array_merge($a, $b),
                  function ($result, $row) {
                      if (!isset($result[$row['ID']])) {
                          $result[$row['ID']] = $row;
                      } else {
                          $result[$row['ID']]['Count'] += $row['Count'];
                      }
                      return $result;
                  },
                  []
              )
          )
      );
      

      【讨论】:

        猜你喜欢
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 2012-12-25
        • 2012-02-29
        相关资源
        最近更新 更多