Daniel (nun registriert): Über Array Indiz assoziative "Ansprechweise" erhalten?

Hallo,
angenommen ich definiere folgendes Array:
$test[bla]=“hallo“;
$test[blubb]=“welt“;

Dann kann ich ja $test[bla] über $test[0] und $test[blubb] über $test[1] ansprechen.
Aber wie könnte ich denn dynamisch ausgeben/in erfahrung bringen, das $test[0] auch über $test[bla] angesprochen werden kann?

Am Ende will ich z.B. sowas ausgeben können:
for($i=0;$i<count($test);$i++)
{
echo“$test[$i] kann alternativ über ??? angesprochen werden<br>\n“;
}

Die Ausgabe sollte dann
$test[0] kann alternativ über $test[bla] angesprochen werden
$test[1] kann alternativ über $test[blubb] angesprochen werden
lauten bzw. wichtig ist halt auf „bla“ und „blubb“ zu kommen, dann kann man sich das weitere ja zusammenbasteln (wirklich benötigen würde ich in meinem Fall nur „bla“ und „blubb“)
Schonmal vielen Dank :-)

  1. verschachtele "for" und "foreach"
    MFG
    bleicher

    --
    __________________________-
    Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
    1. wobei foreach mit echo $i++; auch ausreicht ;)
      MFG
      bleicher

      --
      __________________________-
      Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
    2. verschachtele "for" und "foreach"

      Ich verstehe nicht, wie ich damit vom Indiz zur assoziativen ansprechweise gelangen soll? Beispielcode?

      1. das klappt aber NUR wenn der array auch "doppeltinziert " sit :)

        foreach ($arr as $key => $value) {
           echo "Schlüssel: $key; Wert: $value<br />\n";
        }

        wird dir jeweils DOPPELTes Array liefern - einmal mit "wortkeys" und ein mal mit "zahlen" , du brauchst es bloß erneut in 2 arrays abzufangen , for liefert dir dabei die durchlaufende numemrierung.

        Insgesamt - WOZU brauchst du es O_o? ist ja so sinnlos wie politischkorrektheit !?

        MFG
        bleicher

        --
        __________________________-
        Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
  2. Hallo,

    angenommen ich definiere folgendes Array:
    $test[bla]=“hallo“;
    $test[blubb]=“welt“;

    Das ist schonmal zum einen falsch und zum anderen schlechter Stil. Falsch deswegen, da “ kein Stringbegrenzer in PHP ist, " oder ' dagegen schon. Ferner sollten assoziative Indizes *immer* in Anführungszeichen gesetzt werden, sonst ersetzt Dir PHP irgendwann noch ne Konstante da rein - ferner gibt's ordentlich Meldungen auf einem System mit E_ALL-Fehlermeldungseinstellungen -> korrekt wäre also $text['bla'] = 'hallo'; etc.

    Dann kann ich ja $test[bla] über $test[0] und $test[blubb] über $test[1] ansprechen.

    Huch? Wie das denn? Wenn Du $test['bla'] = 'hallo'; machst dann ist $test[0] nicht definiert (wenn Du $test[bla] = 'hallo' machst und bla eine Konstante ist, die auf den Wert 0 expandiert, dann schon, aber ich hoffe doch stark, dass Du das nicht meinst...), weswegen $test[0] eine Notice ausspuckt und NULL ergeben wird - aber definitiv *nicht* den Wert von 'hallo' - dito bei $test[1].

    Aber wie könnte ich denn dynamisch ausgeben/in erfahrung bringen, das $test[0] auch über $test[bla] angesprochen werden kann?

    Das anlegen eines assoziativen Index führt *nicht* dazu, dass ein numerischer Index als Alias darauf angelegt wird. Damit ist auch Deine Problemstellung irgendwie hinfällig. Es gibt einige PHP-Funktionen, die derartige Arrays zurückgeben (Datenbankfunktionen, die sowohl numerische als auch assoziative Indizes für die Rückgabespalten erzeugen, each(), bestimmt noch ein paar andere) - das ist aber ein Zusatz dieser Funktionen, aber kein Standardverhalten von PHP.

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. Huch? Wie das denn? Wenn Du $test['bla'] = 'hallo'; machst dann ist $test[0] nicht definiert

      Es gibt einige PHP-Funktionen, die derartige Arrays zurückgeben (Datenbankfunktionen, die sowohl numerische als auch assoziative Indizes für die Rückgabespalten erzeugen,

      ich vermute auch stark ein SQL response ;) (bzw. übungsversuch :P

      MFG
      bleicher

      --
      __________________________-
      Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
  3. Danke für eure Antworten, wäre es denn möglich dynamisch alle assoziativen Elemente von $test auszugeben, d.h.
    "$test hat die assoziativen Elemente bla und blubb" ?

    Mein Ziel ist es, in einem assoziativen Array (genauer genommen $_GET und $_POST) alle enthaltenen Elemente dynamisch anzusprechen und prüfen zu können (regüläre Ausdrücke).

    Sinn des ganzen:

    • Globale Überprüfung von GET Parametern
    • Grundsätzlich Prüfung aller GET Parameter auf z.b. 0-9, aber eben ohne diese manuell angeben zu müssen (so kann es nicht vorkommen, das man etwas vergisst!)
    • Definierung von Ausnahmen für bestimmte GET Parameter wie z.B. $_GET[suchbegriff]

    => Vermeidung von SQL Injection

    1. Beim $_GET Array geht übrigens das, was ich im Eröffnungspost angesprochen habe, die assoziativen Elemente lassen sich auch per Indiz ansprechen - nur wie komme ich vom Indiz zur assoziativen ansprechweise?

    2. Moin!

      Mein Ziel ist es, in einem assoziativen Array (genauer genommen $_GET und $_POST) alle enthaltenen Elemente dynamisch anzusprechen und prüfen zu können (regüläre Ausdrücke).

      Schon mal foreach angeschaut?

      Sinn des ganzen:

      • Globale Überprüfung von GET Parametern

      Wobei ich mich frage, wann das notwendig sein sollte. Eine Applikation sollte genau wissen, welche Parameter sie erwartet, und alle anderen Parameter ignorieren. Die erwarteten Parameter haben dann die definierten Formate zu haben, was man natürlich prüfen und sicherstellen muß, ansonsten ist es ein Fehler, der zu behandeln wäre.

      • Grundsätzlich Prüfung aller GET Parameter auf z.b. 0-9, aber eben ohne diese manuell angeben zu müssen (so kann es nicht vorkommen, das man etwas vergisst!)

      Wenn du global arbeitest und nichts vergißt, handelst du dir aber mitunter viel ärgere Probleme ein.

      • Definierung von Ausnahmen für bestimmte GET Parameter wie z.B. $_GET[suchbegriff]

      => Vermeidung von SQL Injection

      SQL-Injection vermeidest du nicht dadurch, dass du in $_GET global nachguckst, ob da nur Zahlen drinstehen, sondern indem du Benutzerdaten passend durch die zugehörige Escapingfunktion schickst. mysql_real_escape_string() wäre da der Klassiker. Ansonsten steckt nämlich die Injection dann in deinen Ausnahmen wie $_GET['suchbegriff'] drin.

      Insgesamt ist bei PHP natürlich ohnehin die Behandlung der Eingabedaten zu berücksichtigen, also z.B. die Einstellung von magic_quotes_gpc und magic_quotes_runtime. Das wurde aber schon in vielen Postings hier behandelt. Mitlesen bildet!

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. SQL-Injection vermeidest du nicht dadurch, dass du in $_GET global nachguckst, ob da nur Zahlen drinstehen, sondern indem du Benutzerdaten passend durch die zugehörige Escapingfunktion schickst. mysql_real_escape_string() wäre da der Klassiker. Ansonsten steckt nämlich die Injection dann in deinen Ausnahmen wie $_GET['suchbegriff'] drin.

        Die entsprechenden String Funktionen muss ich mir noch anschauen, aber schonmal danke für den Hinweis. Für $_GET['suchbegriff'] hätte ich auch Einschränkungen festgelegt, aber (evtl. zusätzlich oder auch nur, muss ich mich noch n bisle einlesen) die entsprechenden Escapingfunktionen scheinen mir da die bessere Wahl, kann man so doch die DB besser durchsuchen.

        Mitlesen bildet!

        Ich bin dabei :-)

  4. Lieber Daniel,

    $test[bla]=“hallo“;
    $test[blubb]=“welt“;

    dass dieser Code ganz übel ist, wurde Dir schon gesagt.

    PHP unterscheidet (Überraschung!) _nicht_ zwischen assoziativ indizierten und numerisch indizierten Arrays. Für PHP ist das alles dasselbe. Siehe folgendes Beispiel (aus der PHP-Doku):

    $arr = array("foo" => "bar", 12 => true);  
      
    echo $arr["foo"]; // bar  
    echo $arr[12];    // 1
    

    Lediglich die Sortierfunktionen unterscheiden das (scheinbar), denn wenn in einem Array nur numerische Indices stehen, dann kann es erwünscht sein, die Array-Werte neu "durchzunummerieren", sprich die Zuordnung von Index zu Wert neu zu definieren. In unserem obigen Beispiel wäre das allerdings fatal.

    Aus ebendiesem Grund verfügt PHP ja auch über diese Vielfalt an Sortierfunktionen für Arrays!

    Dann kann ich ja $test[bla] über $test[0] und $test[blubb] über $test[1] ansprechen.

    Nein. Wie schon aus dem oben angeführten Codebeispiel ist eine Zuweisung von Index zu Wert eindeutig. Es gibt zum Index [0] keinen Wert, da du diesen Index nicht verwendet hast!

    Aber wie könnte ich denn dynamisch ausgeben/in erfahrung bringen, das $test[0] auch über $test[bla] angesprochen werden kann?

    Erstens muss es "dass" heißen *SCNR* und zweitens ist dem nicht so.

    Am Ende will ich z.B. sowas ausgeben können:
    for($i=0;$i<count($test);$i++)
    {
    echo“$test[$i] kann alternativ über ??? angesprochen werden<br>\n“;
    }

    Das ist völlig unmöglich, da es nicht mit der Struktur von Arrays in PHP zusammenpasst. Vergiss es!

    Wenn Du die verwendeten Indices und die ihnen zugewiesenen Werte in einer Schleife durchgehen möchtest, dann empfiehlt sich folgendes Konstrukt:

    // Alle Array-Inhalte (Wertepaare) durchlaufen:  
    foreach ($mein_array as $index => $wert) {  
        echo "Aktueller Index: $index\n";  
        echo "zugewiesener Wert: $wert\n\n";  
    }
    

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

  5. Ok, ihr habt wohl recht, die Aussage wegen $_GET ist ein Missverständnis (habe nicht getestet ob es evtl. trotzdem geht...),
    allerdings ist es trotzdem (in für mich meiner Meinung nach noch besserer Form) möglich, dynamisch die assoziative Ansprechsweise zu erhalten:

    <?php

    $test[bla]=“hallo“;
    $test[blubb]=“welt“;

    $i=0;

    foreach($test as $key => $value) {
    echo"<p>Element $i hat den Schlüssel $key und den Wert $value.<br />";
    $i++;
    }

    ?>

    Da ich mir nichts zu eigen machen will (ok, es ist schlichtweg ne PHP Funktion/Bestandteil der PHP Sprache, aber wie auch immer):
    Der Code stammt von "abuck" in der piranho.com community

    1. Lieber Daniel,

      <?php

      $test[bla]=“hallo“;
      $test[blubb]=“welt“;

      $i=0;

      foreach($test as $key => $value) {
      echo"<p>Element $i hat den Schlüssel $key und den Wert $value.<br />";
      $i++;
      }

      ?>

      und wie willst Du nun von $i auf den entsprechenden $key schließen???

      Es ist - und das habe ich auch erst hier im Forum gelernt - sinnvoll "sprechende" Schlüssel in den Arrays zu verwenden. Daher ist das Herausfinden, an welcher Stelle er im Array steht, müßig! Spätestens nach einem Sortieren des Arrays oder Löschen eines Index stimmt diese numerische Position vielleicht nicht mehr. Wozu also das Ganze???

      Selbst wenn Du auf das Vorhandensein eines Schlüssels prüfen wolltest, so nimmst Du dafür array_key_exists()!

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. und wie willst Du nun von $i auf den entsprechenden $key schließen???

        Es ging mir darum, einfach dynmisch alle Array Schlüssel zu erhalten. Ob das nun über $i ist oder eben per foreach Schleife ist für mich unrelevant. Meine Formulierung/überlegung war da wohl zu restriktiv/schon mit einem Gedanken verknüpft.

        Selbst wenn Du auf das Vorhandensein eines Schlüssels prüfen wolltest, so nimmst Du dafür array_key_exists()!

        Aber ich muss die Schlüssel doch erst einmal haben, es geht mir ja darum, dynamsich alel Schlüssel zu erhalten, nicht alle möglichen durchzuprobieren (die ich dann wieder manuell angeben müsste, somit könnte ich wieder einen vergessen...).

        1. Hallo,

          Aber ich muss die Schlüssel doch erst einmal haben, es geht mir ja darum, dynamsich alel Schlüssel zu erhalten, nicht alle möglichen durchzuprobieren (die ich dann wieder manuell angeben müsste, somit könnte ich wieder einen vergessen...).

          Was spricht gegen:

          $foo['eins'] = "test 1";  
          $foo['zwei'] = "test 2";  
            
          foreach($foo AS $key => $value) {  
            $keys[] = $key;  
          }
          

          Dann hast du ja alles keys dynamisch ausgelesen, oder verstehe ich das falsch?

          Grüße
          Jeena Paradies

          1. Moin!

            Aber ich muss die Schlüssel doch erst einmal haben, es geht mir ja darum, dynamsich alel Schlüssel zu erhalten, nicht alle möglichen durchzuprobieren (die ich dann wieder manuell angeben müsste, somit könnte ich wieder einen vergessen...).
            Was spricht gegen:

            $foo['eins'] = "test 1";

            $foo['zwei'] = "test 2";

            foreach($foo AS $key => $value) {
              $keys[] = $key;
            }

              
            Es spricht die Tatsache dagegen, dass es dafür bereits eine Funktion gibt: [array_keys()](http://de2.php.net/manual/de/function.array-keys.php).  
              
            Liefert ein numerisch indiziertes Array zurück, in dem die Schlüssel des Arguments stehen.  
              
             - Sven Rautenberg
            
            -- 
            "Love your nation - respect the others."
            
            1. Hallo,

              Es spricht die Tatsache dagegen, dass es dafür bereits eine Funktion gibt: array_keys().
              Liefert ein numerisch indiziertes Array zurück, in dem die Schlüssel des Arguments stehen.

              In PHP gibt es wohl für jeden Pfurz eine eigene Funktion, wer soll sich denn die alle merken können?

              Grüße
              Jeena Paradies

              1. Hallo Jeena.

                In PHP gibt es wohl für jeden Pfurz eine eigene Funktion, wer soll sich denn die alle merken können?

                Wahrscheinlich niemand. Der Trick besteht – wie so oft – darin, zu wissen, wo man suchen muß/kann.

                --
                Once is a mistake, twice is jazz.
                1. Hallo,

                  Wahrscheinlich niemand. Der Trick besteht – wie so oft – darin, zu wissen, wo man suchen muß/kann.

                  Und was ist der Trick dabei daran zu denken dass es für $irgendwas außergewöhnliches auch eine fertige Funktion gibt? Vor allem wenn man eigentlich auch ziemlich schnell was eigenes basteln kann? (das die fertige Funktion schneller ist, ist mir bewusst)

                  Grüße
                  Jeena Paradies

                  1. Tach Jeena.

                    Wahrscheinlich niemand. Der Trick besteht – wie so oft – darin, zu wissen, wo man suchen muß/kann.
                    Und was ist der Trick dabei daran zu denken dass es für $irgendwas außergewöhnliches auch eine fertige Funktion gibt? Vor allem wenn man eigentlich auch ziemlich schnell was eigenes basteln kann? (das die fertige Funktion schneller ist, ist mir bewusst)

                    Es hält dich doch niemand davon ab, deine eigenen Funktionen zu schreiben und zu benutzen. Ich versteh dein Problem nicht. Gibt es überhaupt eins?

                    Davon mal abgesehen finde ich die Aufgaben, die die meisten eingebauten PHP-Funktionen erledigen gar nicht so "außergewöhnlich" – auch nicht Daniels Problem. Daß diese Funktionen implementiert wurden, dürfte in vielen Fällen daran liegen, daß sie häufiger gebraucht werden. Der Fuhrpark war ja nicht von Anfang an so riesig.

                    --
                    Once is a mistake, twice is jazz.
                    1. Hallo,

                      Es hält dich doch niemand davon ab, deine eigenen Funktionen zu schreiben und zu benutzen. Ich versteh dein Problem nicht. Gibt es überhaupt eins?

                      Nein, eigentlich nicht.

                      Grüße
                      Jeena Paradies