我有以下代码以不区分大小写的方式将平面数组中的关联元素分组并对相关值求和,但我真的不明白它是如何工作的。
function add_array_vals($arr) {
$sums = [];
foreach ( $arr as $key => $val ) {
$key = strtoupper($key);
if ( !isset($sums[$key]) ) {
$sums[$key] = 0;
}
$sums[$key] = ( $sums[$key] + $val );
}
return $sums;
}
$array = ['KEY' => 5, 'TEST' => 3, 'Test' => 10, 'Key'=> 2];
$sums = add_array_vals($array);
var_dump($sums);
//Outputs
// KEY => int(7)
// TEST => int(13)
我在上面代码的两部分有问题 一个是:
if ( !isset($sums[$key]) ) {
$sums[$key] = 0;
}
另一个是:
$sums[$key] = ( $sums[$key] + $val );
在这部分,它如何识别数组的相同键来对它们求和(因为键的位置是动态的)?
if ( !isset($sums[$key]) ) { $sums[$key] = 0; }
$sums
开始时是一个空数组,但我们正在尝试向其中添加数字。如果我们尝试向 $sums[$key]
添加一个尚未初始化的数字,我们会得到一个错误,因此我们在第一次遇到它时通过将其设置为零来初始化它。
$sums[$key] = ( $sums[$key] + $val );
这是上一行的第二部分。
$sums[$key]
在这一点上要么是零,多亏了前一行,要么是一个整数,因为我们之前在循环中遇到过它。
$key
中的$sums[$key]
在此代码中将是“TEST”或“KEY”。
此代码按大写键组求和。
第一步:检查密钥是否存在。如果不存在则填充初始零值。这种情况对每个键(组的基础)发生一次。这是必要的,这样密钥的不存在不会在下一步中造成问题。
if ( !isset($sums[$key]) ) { $sums[$key] = 0; }
第二步:将值添加到已存在的密钥容器中:
$sums[$key] = ( $sums[$key] + $val );
if ( !isset($sums[$key]) ) { $sums[$key] = 0; }
这意味着如果
key
或test
没有值,赋值0.
例如
$array = ['KEY', 'TEST' => 3, 'Test' => 10, 'Key'=> 2];
KEY
的值将为 0.
$sums[$key] = ( $sums[$key] + $val );
$sums[$key]
是相同元素的总和。 $sums[$key] + $val
表示将之前的和值添加到新的元素值。