Pjotre: Variablen von Funktion zurück übergeben

Hallo Leute,

ich habe eine Funktion in einer while-Schleife, die ich also diverse male aufrufe und immer andere Variablen bzw. immer ein gleiches Array mitgebe, dessen Inhalte sich jedoch in der Funktion selbst verändern.

Beispiel:
---------
beispiel ($variable1, $variable2, $arrayvariable);
---------
wie gesagt, werden die arrayinhalte in der Funktion verändert und sollen nun wieder zurückgegeben werden, damit beim nächsten Aufruf der Funktion die neuen Inhalte übergeben werden.

Meine Frage ist eigentlich ganz einfach:

Wie kann ich mein Array zurückgeben, an meinen eigentlichen Funktionsaufruf?

Ich Danke für Hilfreiche Tipps

Gruß

  1. Hallo Pjotre,

    Meine Frage ist eigentlich ganz einfach:
    Wie kann ich mein Array zurückgeben, an meinen eigentlichen Funktionsaufruf?

    Du hast hier zwei Möglichkeiten:

    Entweder Du gibst tatsächlich ein Array als Funktionsergebnis zurück. Das geht nicht in jeder Programmiersprache, oder aber, du vereinbarst das Array statisch im externen Scope und übergibst nur die Referenz auf dieses an die Funktion. Diese arbeitet dann nicht mit einer Kopie des Argumentes, sondern mit dem Original. Darauf "zeigt" das Argument und die Funktion weiß daher, wo das Array liegt. Das geht in allen Programmiersprachen, die ich bisher kennengelernt habe.

    Die zweite Methode ist im allgemeinen auch Speicherschonender, da keine lokalen Kopien des Funktionsargumentes angelegt werden müssen.

    LG
    Chris©

    1. , oder aber, du vereinbarst das Array statisch im externen Scope und übergibst nur die Referenz auf dieses an die Funktion. Diese arbeitet dann nicht mit einer Kopie des Argumentes, sondern mit dem Original. Darauf "zeigt" das Argument und die Funktion weiß daher, wo das Array liegt. Das geht in allen Programmiersprachen, die ich bisher kennengelernt habe.
      -----------

      Das klingt interessant, und wie mache ich das bzw .setze ich das nun in die Tat um?

      Ich nutze PHP 5

      Gruß

      1. Hallo Pjotre,

        Das klingt interessant, und wie mache ich das bzw .setze ich das nun in die Tat um?

        Ich nutze PHP 5

        Das habe ich mir zwar schon gedacht, aber Du hattest es nicht geschrieben.

        Bei PHP wird eine "Referenz" vereinbart, indem man bei der Funktionsdeklaration ein & vor den Argumentbezeichner setze.

        function var_call($zahl, $index, &$feld)
           {
               if (isset($feld[$index]))
               {
                   $feld[$index] = $zahl;
                   return true;
               }

        return false;
           }

        Diese Musterfunktion würde im Array $feld das Element mit dem Index $index mit dem Wert $zahl überschreiben, wenn es vorhanden ist und dann 'true' zurückgeben als Funktionsergebnis. Ist das Element nicht vorhanden, wird 'false' zurückgegeben.

        Auf diese Weise hättest Du also die Möglichkeit, in komplexen Datenstrukturen Änderungen vornehmen zu lassen und außerdem einen Fehlercode (z.B. true oder false, oder eine numerische Fehlerkennung) zurückgeben zu lassen.

        Der Aufruf erfolgt einfach

        $ok = var_call(22, 'alter', $feld);

        also _ohne_ das &-Zeichen vor dem Argument.

        LG

        Chris©

        1. So, jetzt nochmal langsam:
          Istzustand:

          while($arrayvariable[0]!="ok") {
          //ich rufe die funktion auf so oft auf, bis "ok" im index "0" steht
          beispiel ($variable1, $variable2, $arrayvariable);
          }

          function beispiel ($variable1, $variable2, $arrayvariable)
          {
          //hier bearbeite ich einige variablen, wobei die ca.50 verschiedenen Inhalte des Arrays geändert werden könnten. Diese Änderungen muss ich unbedingt wieder an diese Funktion übergeben, sobald ich sie das nächste mal aufrufe.
          }

          Wenn ich das richtig sehe, wird bei Deinem Beispiel lediglich true oder false zurück gegeben. Ich benötige aber die 50 Inhalte des Arrays

          Oder sehe ich das jetzt falsch?

          function var_call($zahl, $index, &$feld)
             {
                 if (isset($feld[$index]))
                 {
                     $feld[$index] = $zahl;
                     return true;
                 }

          return false;
             }

          Gruß

          1. Mahlzeit,

            while($arrayvariable[0]!="ok") {
            //ich rufe die funktion auf so oft auf, bis "ok" im index "0" steht
            beispiel ($variable1, $variable2, $arrayvariable);
            }

            Woher kommen $variable1 und $variable2 bzw. was enthalten sie?

            function beispiel ($variable1, $variable2, $arrayvariable)
            {
            //hier bearbeite ich einige variablen, wobei die ca.50 verschiedenen Inhalte des Arrays geändert werden könnten. Diese Änderungen muss ich unbedingt wieder an diese Funktion übergeben, sobald ich sie das nächste mal aufrufe.
            }

            Wenn ich das richtig sehe, wird bei Deinem Beispiel lediglich true oder false zurück gegeben. Ich benötige aber die 50 Inhalte des Arrays

            Die stehen weiterhin in $arrayvariable drin. Natürlich nur, wenn Du in der Funktionsdefinition statt $arrayvariable eine Referenz auf die von außen übergebene Variable angibst: &$arrayvariable.

            Generell ist es wenig sinnvoll, globale und lokale Variablen gleich zu benennen. Ich vermute, dies hast Du jetzt nur wegen des Beispiels gemacht. Aber auch in diesem Fall solltest Du Dir die Mühe machen und unterschiedliche Namen für unterschiedliche Variablen benutzen - einerseits, damit keine Verwirrung bei Deinen Lesern aufkommt und andererseits, damit Deine Leser wissen, dass Du die Variablen nicht verwechselst. :-)

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Hallo Ecki,

              was spielt es für eine Rolle, was in den Variablen steht?

              ich kanns auch ganz schlicht machen:

              while ($test[5]!="12")
              {
              beispiel ($test);
              }

              function beispiel ($empfang)
              {
              $empfang[5]=($empfang[5]+1);
              }

              Wie bekomme ich jetzt meine "$empfang"-Variable wieder zurück gegeben zur "$test"-Variable?

              Gruß

              1. Mahlzeit,

                was spielt es für eine Rolle, was in den Variablen steht?

                Woher soll ich wissen, ob es eine Rolle spielt? Das frage ich Dich - wer weiß, ob diese Variablen in der Funktion beispiel irgendwas mit dem Array machen?

                Wie bekomme ich jetzt meine "$empfang"-Variable wieder zurück gegeben zur "$test"-Variable?

                Wie Chris und ich beschrieben: mittels einer Referenz - die Du, wie Chris ganz richtig anmerkte, offenbar noch gar nicht ausprobiert hat:

                function beispiel (&$empfang) {  
                  $empfang[5]=($empfang[5]+1);  
                }
                

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
              2. Hallo Pjotre,

                was spielt es für eine Rolle, was in den Variablen steht?

                Das fragst Du uns? Ich dachte, es wäre Dir wichtig, was in den Variablen steht und wann der Inhalt verändert wird?

                "Normale" Funktionsattribute werden als Kopie an die Funktion übergeben, Referenzen zeigen aber immer auf das Original. So die klassische Vorstellung, von der wir im PHP-Modell auch ausgehen können. Wie es von PHP wirklich intern geregelt wird, geht uns nichts an.

                Das Original muss vor dem FunktionsAUFRUF vorhanden sein.
                Lass Dir den Inhalt anzeigen.

                ich kanns auch ganz schlicht machen:

                Ich bitte sogar darum!

                while ($test[5] != "12")
                {
                    beispiel ($test);
                }

                function beispiel (&$empfang)   ## hier war Dein Fehler

                {
                    $empfang[5]=($empfang[5]+1);
                }

                Wie bekomme ich jetzt meine "$empfang"-Variable wieder zurück gegeben zur "$test"-Variable?

                So!
                Es ist dieselbe Variable. Durch das '&' in der Deklaration vor dem '$empfang' hast Du PHP mitgeteilt, dass es bitte keine Kopie von $empfang anlegen soll und dann deren Adresse an die Funktion übergeben soll, sondern die Originaladresse der Variablen benutzen soll. Das nennt sich dann VAR (Variable Access Reference). Das &-Zeichen ist also das Zeichen für PHP, die originale Access Reference auf die Variable zu benutzen, und KEINE temporäre Kopie der Variablen anzulegen.

                BITTE probiere es isoliert aus. Solche Snippets kann man dann wohlsortiert sammeln und hat immer was zum Nachschlagen, wenn man mal (wieder) die Orientierung verloren hat...

                LG
                Chris©

          2. Hallo Pjotre,

            Oder sehe ich das jetzt falsch?

            Viel schlimmer, Du siehst gar nichts, weil Du es nicht ausprobiert hast!

            Führe das Beispiel einfach mal aus.
            Schau Dir die Variable $feld vor dem Funktionsaufruf an und danach.
            Das geht am einfachsten mit

            echo htmlspecialchars(print_r($zahl,1));

            Ich empfinde es als Unsitte, dass immer sofort fertiger funktionstüchtiger Code erstellt werden soll, auch wenn die zu verwendenen Funktionen oder Methoden noch in keiner Weise bekannt sind. Dann baut man sich gefälligst :-)  ein isoliertes Beispiel dafür zusammen und probiert erstmal aus, was passiert. Dazu gehört gucken, gucken, gucken. Also Kontrollausgaben aller beteiligten Variablen zu unterschiedlichen Zeiten und Zuständen.

            LG
            Chris©

            1. Hallo Pjotre,

              echo htmlspecialchars(print_r($zahl,1));

              verda....
              ich meinte hier natürlich das Array, also

              echo htmlspecialchars(print_r($feld,1));

              Aber darauf wärst Du bestimmt auch selber gekommen?

              LG
              Chris©