Rolf B: php-Versuchsaufbau schlägt fehl

Beitrag lesen

Hallo Gregor,

ich habe irgendwie immer noch den Eindruck, dass Du eine andere Lösung für mich suchst und nicht meinen Weg mitgehen möchtest.

Richtig. Das liegt daran, dass dein Datenbeispiel und deine übrigen Beschreibungen nicht zusammenpassen. Deswegen habe ich eine genauere Spezifikation dessen, was Du eigentlich tun willst, erbeten.

Bei wechselndem Parameter $id soll das statische Array zurückgesetzt werden.

Okay. Definiere "zurücksetzen". Für mich bedeutet das: Alle Werte aus dem Array löschen, so dass nur noch [] da steht.

Ich verstehe nicht, warum Du das tun willst. Ich verstehe auch nicht, warum Du $i als Index für das Array nimmst. Wenn Du pro $id Werte aufsummieren willst, müsste dann nicht $id der Index sein? $i scheint mir völlig unerheblich für die Summierung. Zumindest dann, wenn ich dein Beispiel anschaue.

$foo muss nur dann ein Array sein, wenn Du

  • pro $id mehr als eine Summe bilden willst - was dein Beispiel aber nicht nahelegt

oder

  • die Summen für alle $id in diesem Array sammeln willst

Im ersten Fall müsstest Du bei einem $id-Wechsel das Array löschen. Und nach jedem Funktionsaufruf den aktuellen Wert des Arrays zurückgeben, damit man die Summen überhaupt noch hat. Aber wie gesagt: Dein Beispiel legt das nicht nahe und daher halte ich diesen Fall für wenig relevant.

Im zweiten Fall ist kein Zurücksetzen nötig, und an Stelle einer static-Variablen wäre eine global Variable sinnvoller (oder ein Objekt…), damit Du an die gebildeten Summen ohne Verrenkungen herankommst.

Wie ist denn der Datenverlauf in deinem Programm? Ist es so wie in deiner Testdemo, dass die $id Werte separat nacheinander kommen? Oder können sie auch durcheinander erscheinen? Damit wären wir beim zweiten Fall, und ein Zurücksetzen wäre sogar schädlich.

Wenn die $id nacheinander kommen und auch nur eine Summe je $id zu bilden ist, reicht für $foo eine einfache Variable. Ein Array ist unnötig. Du bräuchtest dann aber auch eine static- oder global-Variable für die aktive ID, und wenn der $id Parameter von der aktiven ID abweicht, setzt Du $foo auf 0 (setzt es zurück).

Mit der Zusatzvariable meine ich das so:

function test($id, $i, $betrag) {
   static $currentId = null;
   static $foo;              // braucht keinen Init, denn:

   if ($id != $currentId) {  // dies passiert auch beim ersten Aufruf!
      $foo = [];             // "Zurücksetzen"
      $currentId = $id;
   }
   
   // tu, was mit $foo und $betrag auch immer zu tun ist
}

Aber ich stochere hier im Nebel. Weil Du ein Datenbeispiel zeigst und Code, der dazu nicht passt, und nicht formal beschreibst, was zu tun ist, mit welchen Daten zu arbeiten ist und wie diese Daten strukturiert sind (inbesondere die Frage nach der Sortiertheit der $id Werte). Das Aufschreiben einer genauen Spezifikation dessen, was zu tun ist, ohne Rücksicht auf PHP, könnte Dir bereits deutlich machen, wie Du programmieren musst.

Rolf

--
sumpsi - posui - obstruxi