SAH*_*HAR 3 php arrays if-statement sum array-merge
我想按条件合并数组。如果数组键匹配则添加值,如果不匹配则保留值。
这是我的数组:
Array1
(
[1] => 199
[3] => 1306
[5] => 199
)
Array2
(
[3] => 199
[4] => 199
)
Run Code Online (Sandbox Code Playgroud)
我想要的结果是:
Result
(
[1] => 199
[3] => 1505
[4] => 199
[5] => 199
)
Run Code Online (Sandbox Code Playgroud)
我使用了 if-else 条件,但它重复了已经匹配的值。
这是我的编码尝试:
$all=array();
foreach($sall as $sskey => $ssvalue){
foreach($upgradesall as $uukey => $uuvalue){
//$sskey==$uukey?$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue):($sskey!=$uukey? $all[] = array("id"=>$sskey, "amount"=>$ssvalue):($uukey!=$sskey?$all[] = array("id"=>$uukey, "amount"=>$uuvalue):''));
if($sskey===$uukey){
$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue);
}elseif($sskey!=$uukey){
$all[] = array("id"=>$sskey, "amount"=>$ssvalue);
}elseif($uukey!=$sskey){
$all[] = array("id"=>$uukey, "amount"=>$uuvalue);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这个问题比看起来更简单。你真的只需要一个条件来排除未定义的偏移通知。只需迭代两个数组中的所有键和值,并将值添加到合并数组中的相应键。
foreach ([$a1, $a2] as $a) { // iterate both arrays
foreach ($a as $key => $value) { // iterate all keys+values
$merged[$key] = $value + ($merged[$key] ?? 0); // merge and add
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,实际执行加法 ( $merged[$key] = $value + ($merged[$key] ?? 0);
) 的行可以减少到$merged[$key] += $value;
. 这仍然有效,但它会产生一堆未定义的偏移通知。因此,我们可以将键设置为等于值加上前一个值(如果存在)或零。
如果您仍在使用 PHP 5,则可以使用三元代替空合并运算符 ( ??
),如下所示:
$merged[$key] = $value + (isset($merged[$key]) ? $merged[$key] : 0);
Run Code Online (Sandbox Code Playgroud)
输出不会与您想要的结果中显示的顺序相同,但您可以使用它ksort($merged);
来完成