Я работаю над решением «Очень большой суммы» на HackerRank. Цель состоит в том, чтобы получить сумму всех элементов в массиве без использования array_sum. Для ясности мой примерный код здесь немного отличается от кода.PHP Обратные функции и переменные ссылки
Это работает:
$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
Почему $ общее добавляются правильно, но затем получает брошенный?
Ответ: Благодаря @ 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, чтобы пройти через ваш массив и суммировать значения вместе. – Rizier123
Как связаны пространства имен? Я пытаюсь научиться передавать указатель на функцию, а не только решить эту проблему. – Cyrcle
Не 'use', а' use() 'для анонимных функций, есть разница :) – Rizier123