我正在努力解决 HackerRank 上的“A Very Big Sum”问题。目标是在不使用 array_sum 的情况下生成数组中所有元素的总和。为了清楚起见,我这里的示例代码与那里的代码有点不同。
这有效:
$arr = array(
1000000001,
1000000002,
1000000003,
1000000004,
1000000005
);
$total = 0;
array_walk($arr, 'totalize');
echo '*' . $total;
function totalize( $arr_item ) {
global $total;
$total += $arr_item;
}
Run Code Online (Sandbox Code Playgroud)
我想避免使用全局,以便将来使用回调函数时可以正确执行操作。然而,这不起作用。我将在代码后显示输出:
$arr = array(
1000000001,
1000000002,
1000000003,
1000000004,
1000000005
);
$total = 0;
array_walk($arr, 'totalize', $total);
echo '*' . $total;
function totalize( $arr_item, $key, &$total ) {
$total += $arr_item;
echo $arr_item . '.' . $key . '.' . $total . '<br />';
}
Run Code Online (Sandbox Code Playgroud)
它给出以下输出:
1000000001.0.1000000001
1000000002.1.2000000003
1000000003.2.3000000006
1000000004.3.4000000010
1000000005.4.5000000015
*0
Run Code Online (Sandbox Code Playgroud)
为什么 $total 可以正确相加,但随后又被放弃?
array_walk()无论您在回调的签名中放入什么内容,传递给回调的第三个参数都不是通过引用传递的。对于这种特殊情况,您可以使用带有关键字的匿名函数通过引用导入到函数的作用域中。use$total
$arr = [
1000000001, 1000000002, 1000000003, 1000000004, 1000000005
];
$total = 0;
array_walk($arr, function ($arr_item) use (&$total) {
echo ($total += $arr_item) . "\n";
});
echo '*' . $total;
Run Code Online (Sandbox Code Playgroud)