【发布时间】:2016-05-03 18:10:26
【问题描述】:
我正在努力解决 HackerRank 上的“Avery 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;
}
我想避免使用全局,以便将来在使用回调函数时可以正确处理。但是,这不起作用。我将在代码之后显示输出:
$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 />';
}
它给出这个作为输出:
1000000001.0.1000000001
1000000002.1.2000000003
1000000003.2.3000000006
1000000004.3.4000000010
1000000005.4.5000000015
*0
为什么 $total 被正确加起来却被放弃了?
答案: 感谢@miken32,我发现这行得通:
$arr = array(
1000000001,
1000000002,
1000000003,
1000000004,
1000000005
);
$total = 0;
array_walk($arr, function( $arr_item ) use ( &$total ) { totalize( $arr_item, $total ); } );
echo '*' . $total;
function totalize( $arr_item, &$total ) {
$total += $arr_item;
echo $arr_item . '.' . $total . '<br />';
}
它给出了这个输出:
1000000001.1000000001
1000000002.2000000003
1000000003.3000000006
1000000004.4000000010
1000000005.5000000015
*5000000015
【问题讨论】:
-
要么使用匿名函数并使用
use(),要么只是执行一个简单的 foreach 循环来遍历您的数组并将值相加。 -
命名空间有什么关系?我正在尝试学习如何将指针传递给函数,而不仅仅是解决这个问题。
-
不是
use,而是use()对于匿名函数,有区别:) -
我在以下答案之一中看到了这一点。很有趣。