[英]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.