簡體   English   中英

PHP 唯一/求和/合並數組操作

[英]PHP Unique/SUM/Merge array operations

這很難用文字解釋,但基本上我需要取兩個數組,將它們與唯一值合並,並對其中一列求和。 寫在下面更有意義:

$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 >= 5.3 下面有一個 PHP < 5.3 解決方案。

$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);

從這里開始,將輸出轉換為您想要的格式是一項微不足道的任務。

請不要過度設計這樣一個基本任務。 使用單個循環迭代兩個數組並使用ID值分配臨時鍵。 如果多次遇到相應的ID鍵,只需將新的Count值添加到存儲的值中。

代碼:(演示

$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()是理想的,因為輸出中的元素數將等於或小於輸入數據中的元素數。

代碼:(演示

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;
            },
            []
        )
    )
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM