jwka: Referenz auf Array in Variablenname

Ist wahrscheinlich so ne Dummy Einsteigerfrage, sorry dafür. Habe auch bereits gegoogelt aber nix dazu gefunden (wahrscheinlich suche ich wieder falsch).

Also:
Gegeben sei eine StringVariable $Name, deren Inhalt der Name eines Arrays (z.B. "$Arr01") ist.

Ich würde nun diese Variable gerne bei verschiedenen Funktionen, die man normalerweise auf ein Array anwendet, STATT des Arraynamens verwenden.

Es gibt in anderen sprachen "expand" Zeichen, die die aktuelle Variable gegen deren Inhalt austauscht. Ich benutze hier mal das Zeichen ^, dieses soll quasi die Variable gegen das Array tauschen:

Beispiel:

Statt print_r( $Arr01 ) ==> print_r( ^$Name)

Statt foreach ($Arr01 ) ==> foreach( ^$Name )

Das gäbe die Möglichkeit, mit zur Laufzeit wechselnden Arraynamen zu arbeiten.

Gibts doch sicher, oder?

    1. 1000 Dank.
      Gibt's vielleicht noch einen Hinweis darauf, WARUM das "böser Stil" ist? Ich finde grundsätzlich, dass man eine Programmiersprache mit allem ausreizen darf, was sie bietet.

      jwka

      1. Hi,

        Gibt's vielleicht noch einen Hinweis darauf, WARUM das "böser Stil" ist?

        U.a. deshalb, weil es den Scriptverlauf schwerer nachvollziehbar macht.

        echo $$varname;
        kann mir den Inhalt *jeder* Variablen ausgeben - ich müsste also auch noch den Inhalt von $varname kennen, um ungefähr sagen zu können, was diese eine Codezeile tut.

        Wenn ich jetzt zusammengehörige Werte in einem Array gesammelt und dieses auch noch halbwegs sinnvoll benannt habe, dann weiss ich bei einer Zeile
        echo $messwerte[$i];
        zumindest schon mal, dass diese wohl einen Messwert ausgeben soll (selbst wenn ich noch nicht genau weiss, welchen von denen, weil ich dazu auch wieder den aktuellen Inhalt von $i kennen müsste).

        Aber das erlaubt mir schon sehr viel besser, aus dem Code auch einen beabsichtigten Zweck herauszulesen, als das obige Beispiel.

        Ich finde grundsätzlich, dass man eine Programmiersprache mit allem ausreizen darf, was sie bietet.

        Wenn man weiss, was man tut und wo einen das vielleicht später in den Allerwertesten beissen kann (und was man zur Absicherung dagegen schon jetzt unternimmt) - dann theoretisch schon.

        In der Praxis sinnvoll ist aber nun mal nicht alles, wozu die theoretische Möglichkeit besteht - zumindest nicht pauschal, sondern vielleicht nur in Sonderfällen. eval wäre ein weiteres Paradebeispiel.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Hi ChrisB und jwka.

          Und dazu noch ergänzend:

          Gibt's vielleicht noch einen Hinweis darauf, WARUM das "böser Stil" ist?

          Weil es dafür schlicht und einfach fast nie einen echten Grund gibt.
          Innerhalb ihres Scopes hat eine Variable zunächst mal einen festen Namen, den man ganz einfach benutzen kann. Wenn der Wert der Variable woanders gebraucht wird, dann wird er schlauerweise als Parameter an eine Funktion übergeben, und diese Funktion kümmert es dann herzlich wenig, wie die Variable vorher hieß, weil sie dem Wert ihren eigenen Namen verpasst - selbst dann, wenn sie an der originären Variable herumfummeln will und nur ein Zeiger auf diese übergeben wird.

          Soll heißen: Die Nutzung von variablen Variablen ist fast immer ein Indiz dafür, dass unsinnigerweise globale Variablen benutzt werden, weil sich Funktionen irgendwelche Werte selber holen wollen, die sie sich besser zu Beginn hätten geben lassen. Höchstwahrscheinlich auch in Deinem Fall hier.

          Viele Grüße,
          der Bademeister

      2. Hallo,

        1000 Dank.
        Gibt's vielleicht noch einen Hinweis darauf, WARUM das "böser Stil" ist? Ich finde grundsätzlich, dass man eine Programmiersprache mit allem ausreizen darf, was sie bietet.

        Klar, aber irgendwann merkst Du bei dem ein oder anderen u.U., dass man es anders besser hinbekommt.

        Gruß

        jobo

  1. Hallo,

    Es gibt in anderen sprachen "expand" Zeichen, die die aktuelle Variable gegen deren Inhalt austauscht.

    kenne ich keine bzw. das Feature ist mir nicht bewußt.

    Statt print_r( $Arr01 ) ==> print_r( ^$Name)
    Statt foreach ($Arr01 ) ==> foreach( ^$Name )

    Das gäbe die Möglichkeit, mit zur Laufzeit wechselnden Arraynamen zu arbeiten.
    Gibts doch sicher, oder?

    Funktionen verfügen über die Liste ihrer formalen Parameter. Damit kann man das Problem wunderbar erschlagen.

    Ansonsten kennt PHP das Feature variable Variablen. Wenn man sie verwendet, hat man fast immer [1] etwas falsch gemacht.

    Freundliche Grüße

    Vinzenz

    [1] Sag niemals nie :-)

    1. Ich möchte hierzu noch folgendes ausführen:

      Ich schreibe ein PHP script, das ich FÜR MICH auch ander schreiben könnte.

      Nun ist es aber so, dass dieses Script auch anderen zur Verfügung gestellt werden soll, die dieses ALS TEIL in ihre eigenen Scripte einbauen.

      Um diesen Leuten die Möglichkeit zu geben, die bei Ihnen recht sicher anders lautenden Arrays nur an einer Stelle als "Parameter" (an einer Stelle, wo es das Array des anderen noch gar nicht gibt) einzutragen, will ich eben eine Variable benutzen, über die ich im Weiteren dann an die Inhalte des relevanten Arrays komme.

      Ist sicher kein alltägliches Problem, insofern auch die wohl ehr unorthodoxe Lösung.

      Wenn ich jetzt noch sage, dass das Array erst später per eval() aus einem Sting definiert wird, verschlimmbessert das wahrscheinlich noch die Sache ...

      Allen Helfern Danke. Ich habe jetzt erst mal, was ich brauche, auch wenn's schlchter Stil sein sollte ...

      jwka

      1. Hallo,

        Um diesen Leuten die Möglichkeit zu geben, die bei Ihnen recht sicher anders lautenden Arrays nur an einer Stelle als "Parameter" (an einer Stelle, wo es das Array des anderen noch gar nicht gibt) einzutragen, will ich eben eine Variable benutzen, über die ich im Weiteren dann an die Inhalte des relevanten Arrays komme.

        Dafür würdest Du wohl eigentlich "setter und getter"-Methoden nutzen. Über kurz oder lang, wenn Du den Code optimieren willst, kommst du von diesen "unorthodoxen" Methoden ab, schlicht weil es anders einfacher und übersichtlicher geht (und auch andere damit dann besser klar kommen).

        Gruß

        jobo

  2. Hello,

    Beispiel:

    Statt print_r( $Arr01 ) ==> print_r( ^$Name)

    Statt foreach ($Arr01 ) ==> foreach( ^$Name )

    Das gäbe die Möglichkeit, mit zur Laufzeit wechselnden Arraynamen zu arbeiten.

    Das sieht aus, wie ein Pascaler :-)
    Es gibt in PHP variable Variablen

    http://de2.php.net/manual/de/language.variables.variable.php

    aber es wäre besser, wenn Du die Arrays wiederum über ihren Namen in ein Array einbindest

    $_master = array();

    $_slave = array();

    es folgt die Definition von $_slave

    $_master['slave'][0] = $_slave;
    $_master['slave'][1] = $_slave;

    usw...

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. Hi.

    Gegeben sei eine StringVariable $Name, deren Inhalt der Name eines Arrays (z.B. "$Arr01") ist.

    Ich moechte zu den anderen Antworten und dem Gebrauch von variablen Variablen noch kurz ergaenzen:

    Der Name (oder besser: Bezeichner) einer Variable, die Du in PHP als $Arr01 gebrauchst, ist nur "Arr01", nicht "$Arr01". Klingt vielleicht nach Klugscheisserei, aber der PHP-Parser ist halt nun mal auch ein Klugscheisser :-)

    Viele Gruesse,
    der Bademeister