Lara: zusammenführen zwei Variablennamen

Ich habe zwei Variablen die ich zusammenführen möchte so das es ein VariablenName ist:

$var=1;

$zahl_.$var=12;

echo $zahl_1;

Aber leider klappt es nicht.

Lara

  1. Hallo,

    Ich habe zwei Variablen die ich zusammenführen möchte so das es ein VariablenName ist:

    variable Variablen konnte PHP mal, afaik ist das aber vorbei.

    Beschäftige dich mit Arrays, da kannst du solche Sachen basteln.

    Gruß
    Kalk

    1. Hello,

      Hallo,

      Ich habe zwei Variablen die ich zusammenführen möchte so das es ein VariablenName ist:

      variable Variablen konnte PHP mal,

      Ja. PHP kan indirekten Variablenzugriff

      afaik ist das aber vorbei.

      Wo steht das?

      Beschäftige dich mit Arrays.

      Ack

      Glück Auf
      Tom vom Berg

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
      1. Hallo,

        afaik ist das aber vorbei.

        Wo steht das?

        offensichtlich hab ich mich geirrt. Es ist aber nicht empfehlenswert, da es zu nicht nachvollziehbarem Code führt.

        Gruß
        Kalk

        1. Hello,

          Hallo,

          afaik ist das aber vorbei.

          Wo steht das?

          offensichtlich hab ich mich geirrt. Es ist aber nicht empfehlenswert, da es zu nicht nachvollziehbarem Code führt.

          Stimmt für Skalare auf jeden Fall.

          Bei Arrays kann man diese Möglichkeit für Aliase auf Teilarrays nutzen, was für einige Operationen sehr praktisch ist.

          Glück Auf
          Tom vom Berg

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

            afaik ist das aber vorbei.

            Wo steht das?

            offensichtlich hab ich mich geirrt. Es ist aber nicht empfehlenswert, da es zu nicht nachvollziehbarem Code führt.

            Stimmt für Skalare auf jeden Fall.

            Bei Arrays kann man diese Möglichkeit für Aliase auf Teilarrays nutzen, was für einige Operationen sehr praktisch ist.

            Für den Direktzugriff auf Subarrays meintest Du aber bestimmt den Adressoperator und nicht den indirekten Namenszugriff?

            Spirituelle Grüße
            Euer Robert

            --
            Möge der Forumsgeist ewig leben!
            1. Hallo robertroth,

              danke für die Mahnung. Diese Spezialität der Speicherverwaltung in PHP kann man nicht oft genug wiederholen.

              Solange man nichts anderes verlangt, übergibt PHP alles per Wert. Sowas ist klassischerweise ein bäh für die Performance, weil wie wild kopiert wird.

              Die Magie der schnellen Ausführung in PHP besteht darin, dass PHP die Kopie solange hinauszögert, bis ein Schreibzugriff erfolgt.

              $foo = [
                 [ 11, 12, 13, 14 ],
                 [ 21, 22, 23, 24 ]
              ];
              
              $x = $foo[0];   // <-- $foo[0] und $foo[1] werd NOCH nicht kopiert.
              $y = $foo[1];   //      $x und $foo[0] zeigen auf den gleichen Speicher.
                              //      $y und $foo[1] ebenso.
              

              D.h. beiden Teilarrays werden jetzt doppelt genutzt. Es sind "Geheime Referenzen" entstanden. PHP zählt das mit (reference counting). Schreibzugriffe lösen die Geheimreferenzen auf und erstellen Kopien:

              $x[2] = 4711;   // <-- kopiert $foo[0] und $x zeigt auf die Kopie.
              $foo[1] = 815;  // <-- kopiert $foo[1]. $y behält den alten Wert, und
                              //     $foo[1] bekommt die Kopie
              

              Jetzt haben wir vier Teilarrays und keine Geheim-Referenzen mehr. Alle werden nur noch einmal genutzt. Und das bedeutet, dass weitere Schreibzugriffe keine Kopie mehr herstellen.

              $x[3] = 1234;   // Keine Kopie!
              

              Ich glaube, diesen Aufwand mit copy-on-demand treibt keine andere Programmiersprache. Anderswo bleibt das dem Programmierer überlassen.

              Der Adressoperator ändert das Verhalten! An Stelle einer geheimen Referenz entsteht eine öffentliche, und die darf auch öffentlich weiterexistieren:

              $foo = [ 1,2,3,4 ];
              $x = &$foo;         // Hier entsteht eine offizielle Referenz
              
              $x[2] = 123;        // Jetzt wird NICHT kopiert!
              print_r($foo);      // Änderung ist in $foo sichtbar
              

              Rolf

              --
              sumpsi - posui - obstruxi
            2. Hello,

              afaik ist das aber vorbei.

              Wo steht das?

              offensichtlich hab ich mich geirrt. Es ist aber nicht empfehlenswert, da es zu nicht nachvollziehbarem Code führt.

              Stimmt für Skalare auf jeden Fall.

              Bei Arrays kann man diese Möglichkeit für Aliase auf Teilarrays nutzen, was für einige Operationen sehr praktisch ist.

              Für den Direktzugriff auf Subarrays meintest Du aber bestimmt den Adressoperator und nicht den indirekten Namenszugriff?

              Ertappt :-O
              Stimmt selbstverständlich.

              Und die weiteren Folgen hat Rolf_B ja sehr schön beschrieben.

              Gebrauchen kann man das sehr schön beim derefrerenzierten Zugriff auf Subarrays.

              Glück Auf
              Tom vom Berg

              --
              Es gibt nichts Gutes, außer man tut es!
              Das Leben selbst ist der Sinn.
    2. Hallo Tabellenkalk,

      variable Variablen konnte PHP mal

      Kann es immer noch, aber man sollte es nicht tun.

      So geht's nicht

      $var=1;
      $zahl_.$var=12;
      echo $zahl_1;
      

      Aber so - auch wenn man das nicht tun sollte.

      $var = 1;
      ${"zahl_".$var} = 12;
      echo $zahl_1;
      

      So geht's mit Arrays:

      $var = 1;
      $zahl = ARRAY();     // Diese Zeile ist nicht unbedingt nötig
      $zahl[$var] = 12;
      var_dump($zahl);
      

      Die Initialisierung von $zahl mit ARRAY() (oder [] in neuer Notation) ist nicht zwingend nötig wenn $zahl noch undefiniert war, aber es birgt eine Tretmine, wenn man es nicht tut: Falls $zahl nämlich nicht undefiniert war, würde es einen Fehler geben.

      $zahl = 7;
      $zahl[3] = 11;    // Laufzeitfehler: Kann Skalar nicht als Array verwenden
      

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Tach!

        $zahl = ARRAY();     // Diese Zeile ist nicht unbedingt nötig
        $zahl[$var] = 12;
        

        Die Initialisierung von $zahl mit ARRAY() (oder [] in neuer Notation) ist nicht zwingend nötig wenn $zahl noch undefiniert war, aber es birgt eine Tretmine, wenn man es nicht tut: Falls $zahl nämlich nicht undefiniert war, würde es einen Fehler geben.

        Wenn das erste Einfügen eines Wertes in ein Array eine eigenständige Anweisung ist, kann man das Array auch als Literal geschreiben zuweisen, um die Probleme zu umgehen.

        $zahl = [$var => 12];
        

        Eine Auftrennung in Erstellen und Einfügen braucht man nur in Schleifen, wenn die Einfüge-Anweisung mehrfach ausgeführt werden soll.

        dedlfix.

  2. WARNUNG!

    wenn Du nicht mindestens sieben (7=) sehr gute Gründe dafür hast, das zu tun, dann lass die Finger von der „Lösung“, Dein Problem liegt woanders.

    So geht es, ich hab den Code aber aus obigen Grund als "bad" markiert

    <?php
    /*
    ** BAD! BAD! BAD! **
    */
    $var = 1;
    ${'zahl_'.$var} = 12;
    echo $zahl_1;
    

    Besser:

    <?php
    
    $i = 1;
    $zahl[$i] = 12;
    echo $zahl[$i];