Ich arbeite an der Lösung "A Very Big Sum" auf HackerRank. Das Ziel besteht darin, die Summe aller Elemente in einem Array zu erzeugen, ohne array_sum zu verwenden. Aus Gründen der Klarheit ist mein Beispielcode hier ein wenig anders als der Code dort.PHP Callback Funktionen und Variablenreferenzen
Dies funktioniert:
$arr = array(
1000000001,
1000000002,
1000000003,
1000000004,
1000000005
);
$total = 0;
array_walk($arr, 'totalize');
echo '*' . $total;
function totalize($arr_item) {
global $total;
$total += $arr_item;
}
Ich möchte eine globale vermeiden, mit so kann ich die Dinge richtig tun, wenn in Zukunft Callback-Funktionen verwenden. Dies funktioniert jedoch nicht. Ich werde den Ausgang nach dem Code zeigen:
$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 />';
}
Es gibt diese als Ausgabe:
1000000001.0.1000000001
1000000002.1.2000000003
1000000003.2.3000000006
1000000004.3.4000000010
1000000005.4.5000000015
*0
Warum der Gesamt $ korrekt hinzugefügt bekommen, aber dann aufgegeben wird?
Antwort: Dank @ miken32 fand ich, dass dies funktioniert:
$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 />';
}
Es gibt diese Ausgabe:
1000000001.1000000001
1000000002.2000000003
1000000003.3000000006
1000000004.4000000010
1000000005.5000000015
*5000000015
Verwenden Sie entweder eine anonyme Funktion und verwenden Sie 'use()' oder machen Sie einfach eine einfache foreach-Schleife, um durch Ihr Array zu gehen und die Werte zusammen zu addieren. – Rizier123
Wie hängen Namespaces zusammen? Ich versuche zu lernen, einen Zeiger auf eine Funktion zu übergeben, nicht nur dieses Problem zu lösen. – Cyrcle
Nicht 'use', aber' use() 'für anonyme Funktionen, gibt es einen Unterschied :) – Rizier123