Hallo Stefan,
das liegt bei Dir an der Verwendung des += Operators. Dieser Operator nimmt den alten Wert und ändert ihn. Ohne eine Initialisierung bekommst Du da natürlich eine Fehlermeldung, dass es für den alten Wert keinen Array-Eintrag gibt.
Es gibt die plumpe Art, das mit dem @ Operator zu unterdrücken. Das ist aber bad-practice, weil der JEDEN Laufzeitfehler unterdrückt.
@$category['reporting']['period']['categorySum'] += $iCode['pi']['period']['sum'];
Besser ist es, zu testen, ob es den Array-Eintrag schon gibt. Das geht auf die mühsame Tour so:
// Ausführlicher IF:
if (isset($category['reporting']['period']['categorySum']))
$wert = $category['reporting']['period']['categorySum'];
else
$wert = 0;
// Abgekürzte Variante mit ?: Operator
$wert = isset($category['reporting']['period']['categorySum']) ? $category['reporting']['period']['categorySum'] : 0;
// Jetzt kann addiert werden.
$category['reporting']['period']['categorySum'] = $wert + $iCode['pi']['period']['sum'];
Mit PHP 7 bekommst Du eine Abkürzung: den „null coalescing operator“ ??. Der funktioniert so, im Vergleich zu älteren Alternativen:
// Null-coalescing "classic"
$foo = isset($bar) ? $bar : 42;
// Null-coalescing Hack ab PHP 5.3 - muss Error-Unterdrückung mit @ einsetzen - bad practice!
$foo = @$bar ?: 42;
// Null-coalescing ab PHP 7
$foo = $bar ?? 42;
Ein null coalescing += gibt's aber nicht, d.h. du musst den null-coalescing Lesezugriff vom Addieren und Zuweisen der Summe trennen. D.h. den Arrayzugriffs-Bandwurm hast Du immer noch zweimal.
$category['reporting']['period']['categorySum'] =
($category['reporting']['period']['categorySum'] ?? 0)
+ $iCode['pi']['period']['sum'];
Eine andere Variante arbeitet mit Referenzbildung und Auslagern in eine Funktion. Der Trick besteht zum einen darin, dass die Übergabe als Referenz unter der Haube die Zielvariable anlegt, ohne zu meckern. Zum anderen wird null beim Addieren wie 0 behandelt, darum kannst in der Funktion dann einfach addieren.
add_value($category['reporting']['period']['categorySum'], iCode['pi']['period']['sum']);
function add_value(&$summe, $summand)
{
$summe += $summand;
}
Funktionsaufrufe sind ab PHP 7 deutlich billiger geworden, aber wenn viele Additionen anstehen, ist die inline-Version immer noch die schnellere. Eine Vorab-Initialisierung ist natürlich immer noch am Besten.
Rolf
sumpsi - posui - clusi