PHP 回调函数和变量引用

Cyr*_*cle 2 php scope

我正在努力解决 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 可以正确相加,但随后又被放弃?

mik*_*n32 5

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)