Pit: Funktionsrückgabewert in Funktionsaufruf verwenden

Hallo,

ich möchte eine Funktion innerhalb einer whileschleife aufrufen und benötige innerhalb des Funktionsaufruf 2 Werte, die als Array in der Funktion erst neu entstehen.

Bsp:

function myFunkt($abc,$cde,$efg,$test1,$test2) {
//…
//…
$test1--;
$test2--;
$arr_neu[] = $test1;
$arr_neu[] = $test2;
return $arr_neu;
}

$test1 = 5;
$test2 = 10;
while ($test > 0) {
$neuwerte = myFunkt($abc,$cde,$efg,$test1,$test2);
}

Nun würde i ch gerne im 2. Durchlauf die von der Funktion veränderten Werte für $test1 und $test2 in den Funktionsaufruf übernehmen.

Wer hilft mir mal gerade auf die Sprünge, wie man das macht?

Pit

  1. Tach!

    Nun würde i ch gerne im 2. Durchlauf die von der Funktion veränderten Werte für $test1 und $test2 in den Funktionsaufruf übernehmen.

    Die Funktion verändert die Werte nur in den lokalen Kopien. Das könnte man mit Referenzen ändern, aber das ist nicht gerade schön und löst das Problem nur bedingt.

    Wer hilft mir mal gerade auf die Sprünge, wie man das macht?

    Die Frage ist, möchtest du das nur im zweiten Durchlauf oder ab dem zweiten so haben?

    Du gibst die geänderten Werte zumindest in deinem Test über den Rückgabewert der Funktion zurück. Mithilfe eines if und einem Zähler kannst du für den nur-im-Fall die Funktion anders aufrufen und die Werte aus dem $neuwerte-Array übergeben. Für den ab-Fall würde es reichen, nach dem Funktionsaufruf die beiden äußeren $test1 und $test2 mit den Werten aus dem $neuwerte-Array zu befüllen und damit in eine neue Runde zu gehen.

    dedlfix.

    1. Hi dedlfix,

      Du gibst die geänderten Werte zumindest in deinem Test über den Rückgabewert der Funktion zurück. Mithilfe eines if und einem Zähler kannst du für den nur-im-Fall die Funktion anders aufrufen und die Werte aus dem $neuwerte-Array übergeben. Für den ab-Fall würde es reichen, nach dem Funktionsaufruf die beiden äußeren $test1 und $test2 mit den Werten aus dem $neuwerte-Array zu befüllen und damit in eine neue Runde zu gehen.

      Gibt es irgendwas an folgender Lösung auszusetzen, was ich übersehen haben könnte?

      
      function myFunkt($abc,$cde,$efg,$test1,$test2) {
      //…
      //…
      $test1--;
      $test2--;
      $arr_neu[] = $test1;
      $arr_neu[] = $test2;
      echo("<pre>");
      print_r($arr_neu);
      return $arr_neu;
      }
      
      $test1 = 5;
      $test2 = 10;
      $arr_neuwerte[] = $test1;
      $arr_neuwerte[] = $test2;
      
      while ($arr_neuwerte[0] > 0) {
      $arr_neuwerte = myFunkt($abc,$cde,$efg,$arr_neuwerte[0],$arr_neuwerte[1]);
      }
      

      Pit

      1. Tach!

        Gibt es irgendwas an folgender Lösung auszusetzen, was ich übersehen haben könnte?

        Ja, die Benennung der Variablen, aber das wird sicher nur zum Test so unintuitiv sein. Inhaltlich macht die Funktion das was dem ab-Fall entspricht. Ansonsten sehe ich grad nichts weiter, außer dass man die beiden Variablen $test1 und $test2 noch rauskürzen kann.

        dedlfix.

        1. Hi dedlfix,

          Ja, die Benennung der Variablen, aber das wird sicher nur zum Test so unintuitiv sein. Inhaltlich macht die Funktion das was dem ab-Fall entspricht. Ansonsten sehe ich grad nichts weiter, außer dass man die beiden Variablen $test1 und $test2 noch rauskürzen kann.

          Der Code ist tatsächlich nur so weit herunter gebrochen und mit Testvariablen bestückt, wie er den Kern meiner Frage repräsentiert. Das Beispiel im "echten" Code ist deutlich komplexer, aber für die Frage selber unnötig. Danke für die Hilfe,

          Pit

  2. Hallo,

    Wer hilft mir mal gerade auf die Sprünge, wie man das macht?

    Objektorientiert arbeiten. Wenn die Funktion in einer Schleife aufgerufen werden soll, ist es naheliegend daß die Funktion nur false // true zurückgibt, je nachdem ob die Schleife erneut durchlaufen werden soll. Der Aufruf sähe also so aus:

    while( $obj->myFunkt($abc,$cde,$efg,$test1,$test2) ){
       $werte = $obj->WERTE;
    }
    
    // in myFunkt $test1--; $test2--
    
    

    D.h., daß das was Du bisher in der Rückgabe hast, nunmehr in den Eigenschaften der Instanz abgelegt ist.

    MfG