Ahlex: Name des Schlüssels eines assoziativen Arrays ausgeben

Guten Abend

ich hoffe, dass der Titel des Themas richtig gewählt ist. Mein Problem ist folgendes:
Ich habe ein solches Array:
$adressen[Name1] = array("Postleitzahl"=>$plz, "Ort"=>$ort);
$adressen[Name2] = array("Postleitzahl"=>$plz, "Ort"=>$ort);

Nun möchte ich alle Adressen "durchgehen" und dabei auch durch irgendeinen Befehl die Werte "Name1" und "Name2" ausgegeben bekommen.

Wenn ich
foreach ($adressen as $adresse=>$elem) {
echo $adresse."<br>";
}
verwende, dann wird mir nur
1
2
ausgegeben, nicht aber
Name1
Name2
.

Vielleicht kennt jemand von euch den Befehl, den ich suche?

Alexander

  1. Hallo Ahlex!

    $adressen[Name1] = array("Postleitzahl"=>$plz, "Ort"=>$ort);

    foreach ($adressen as $adresse=>$elem) {

    Also, eigentlich sollte bei
    foreach ($array as $key => $value)
    als $key der korrekte Key ausgegeben werden.
    Vielleicht liegt es ja daran, daß es eher $adresse['Name'] heißen müßte, würde mich aber fast wundern, wenns daran liegt.

    Vielleicht hilft Dir ja auch noch PHP Manual: Arrays - key().

    MfG
    Götz

    --
    Losung für Freitag, 22. Oktober 2004
    Herr, deine Güte reicht, so weit der Himmel ist, und deine Wahrheit, so weit die Wolken gehen. (Psalm 36,6)
    Siehe, jetzt ist die Zeit der Gnade, siehe, jetzt ist der Tag des Heils! (2. Korinther 6,2)
    (Losungslink)
  2. Vielleicht kennt jemand von euch den Befehl, den ich suche?

    Ja..
    http://de3.php.net/manual/de/control-structures.foreach.php
    Bietet dir folgendes beispiel an:
    foreach ($arr as $key => $value) {
       echo "Schlüssel: $key; Wert: $value<br />\n";
    }
    ?>
    Viel Spaß TomIRL

    1. Guten Abend

      Ja..
      http://de3.php.net/manual/de/control-structures.foreach.php
      Bietet dir folgendes beispiel an:
      foreach ($arr as $key => $value) {
         echo "Schlüssel: $key; Wert: $value<br />\n";
      }
      ?>

      In dem angegebenen Beispiel handelt es sich aber meines Wissens nach um kein assoziatives Array. Dort ist ein Array in der Art
      $arr = array("eins", "zwei", "drei");
      definiert, aber keines, das z.B. so aussieht:
      $arr[Name1] = array("eins", "zwei", "drei");

      Ich möchte ja durch irgendeinen Befehl den Begriff/den String/die Zeichenfolge (wie auch immer) "Name1" ausgegeben bekommen.

      Danke trotzdem

      Alexander

      1. Guten Abend

        Ja..
        http://de3.php.net/manual/de/control-structures.foreach.php
        Bietet dir folgendes beispiel an:
        foreach ($arr as $key => $value) {
           echo "Schlüssel: $key; Wert: $value<br />\n";
        }
        ?>

        In dem angegebenen Beispiel handelt es sich aber meines Wissens nach um kein assoziatives Array. Dort ist ein Array in der Art
        $arr = array("eins", "zwei", "drei");
        definiert, aber keines, das z.B. so aussieht:
        $arr[Name1] = array("eins", "zwei", "drei");

        Ich möchte ja durch irgendeinen Befehl den Begriff/den String/die Zeichenfolge (wie auch immer) "Name1" ausgegeben bekommen.

        Naja dann probier doch das Beispiel mal aus..
        Es müßte gehen.
        Meines Wissens nach, sonst hätte ich Dir das Beispiel kaum genannt.

        TomIRL

  3. Hello Ahlex,

    Ich habe ein solches Array:
    $adressen[Name1] = array("Postleitzahl"=>$plz, "Ort"=>$ort);
    $adressen[Name2] = array("Postleitzahl"=>$plz, "Ort"=>$ort);

    Da stellen wir uns erstmal ganz dumm, und wählen eine andere Schreibweise. Dann wird uns nämlich deutlich, wie es geht.

    $_adressen['Name1']['vorname']      = $vorname
      $_adressen['Name1']['Postleitzahl'] = $plz
      $_adressen['Name1']['Ort']          = $ort
      $_adressen['Name1']['strasse']      = $strasse

    Und nun kann man das Array auch durchgehen:

    foreach($_adressen as $name => $_zusatz)
      {
        echo $<p class="person">$name:</p>
        foreach($_zusatz as $key => $val)
        {
          echo "<p class="daten">$key: $val</p>;
        }
        echo <p class="trenner">".str_repeat('-',35)."</p>";
      }

    Soweit mit dem vorhandenen Array.

    Das ist aber ungünstig aufgebaut. Bau es anders herum auf,

    $_adressen['name'][0]    = $name;
      $_adressen['vormame'][0] = $vorname;
      $_adressen['strasse'][0] = $strasse;
      $_adressen['plz'][0]     = $plz;
      $_adressen['ort'][0]     = $ort;

    $_adressen['name'][1]    = $name1;
      $_adressen['vormame'][1] = $vorname1;
      $_adressen['strasse'][1] = $strasse1;
      $_adressen['plz'][1]     = $plz1;
      $_adressen['ort'][1]     = $ort1;

    Man muss isch dann zwar speuielle Methoden für das Einfügen und das Löschen voen "Datensätzen" machen, die benötigt man aber genaugenommen sowieso, da ja die Usereingaben geprüft werden müssen.

    Die Löschmethode kann man aber auch automatisieren:

    function delete($id)
    {
      foreach($_adressen as $key => $val)
      {
        unset $_adressen[$key][$id];
      }
    }

    Der Aufbau in dieser Form hat den Vorteil, dass man die einzelnen "Spalten" mit den vorhandenen Sortiermethoden von PHP sortieren kann. Man benötigt keine Callbackfunktion dafür. Außerdem benötigt diese Schreibweise erheblich weniger Speicherplatz, als die "klassische", weil die Spaltenschlüssel nich mehr wiederholt werden müssen, sondern es nur noch einen Laufindex innerhalb der Spalte gibt.

    Nachdem man die einzelnen Spalten sortiert hat, ist das Array dann gleichzeitig nach allen Spalten sortiert. Das klingt paradox, ist aber eine sehr interessante Tatsache. In der anderen Form geht das nicht. Da kann man immer nur nach einer "Spalte" sortieren.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hello,

      War wohl zu früh eben. da fehlen ja diverse Zeichen *gg*

      Da stellen wir uns erstmal ganz dumm, und wählen eine andere Schreibweise. Dann wird uns nämlich deutlich, wie es geht.

      $_adressen = array();
         $_adressen['Name1']['vorname']      = $vorname;
         $_adressen['Name1']['Postleitzahl'] = $plz;
         $_adressen['Name1']['Ort']          = $ort;
         $_adressen['Name1']['strasse']      = $strasse;

      Und nun kann man das Array auch durchgehen:

      foreach($_adressen as $name => $_zusatz)
         {
           echo "<p class="person">$name:</p>";

      foreach($_zusatz as $key => $val)
           {
             echo "<p class="daten">$key: $val</p>";
           }
           echo "<p class="trenner">".str_repeat('-',35)."</p>";
         }

      So sollte das aber nun funktionieren, oder?

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Guten Tag

        So sollte das aber nun funktionieren, oder?

        Ja, funktioniert wunderbar. Danke für deine Hilfe!

        Mir wurde bei Verwendung von

        foreach ($adressen as $adresse=>$elem) {
        echo $adresse."<br>";
        }

        nur
        1
        2
        ausgegeben, nicht aber
        Name1
        Name2
        , weil ich vorher das Array mit einer Vergleichsfunktion sortieren ließ:
        usort($adressen, "vergleich");

        In dieser Vergleichsfunktion steht folgendes:

        function vergleich($a, $b) {
        return strnatcasecmp($a["Name"], $b["Name"]);
        }

        Warum dadurch die Schlüssel von Name1, Name2, usw. zu 1, 2, usw. verändert werden, weiß ich nicht. Kannst du mir das erklären? Wie kann ich eine Sortierung unter Beibehaltung der Schlüssel vornehmen?

        Alexander

        1. Hello,

          Wie kann ich eine Sortierung unter Beibehaltung der Schlüssel vornehmen?

          Dazu solltest Du als erstes meine Variante für die Struktur des Arrays benutzehn und dann zweitens einfach nach der entsprechenden Spalte mit einer der Array-Sortierfunktionen sortieren. Die sind unter http://de2.php.net/manual/de/ref.array.php beschrieben. Besser als dort, kann ich sie ohne besonderes Anforderungsprofil auch nicht beschreiben.

          ----------
          Und noch ein kleiner Seitenhieb auf meinen sehr geschätzten Mitposter (er wird schon wissen, dass er gemeint ist), der mich zu den Laien zurückgeschickt hat für diese Art des Arrayaufbaus:

          Wie kann man schnell Werte eines Arrays addieren?
          Richtig!
          Mit http://de2.php.net/manual/de/function.array-sum.php

          Wenn ich doch aber ein Feld mit dem Namen und eines mit dem Gehalt und eines mit der Adresse habe?
          Auch richtig!
          Dann geht das Addieren oder die Mittelwertbildung oder das Sortieren oder ... des Gehaltes oder der Telefonnummer (*gg*) eben nur ganz einfach, wenn man meine Variante des Arrayaufbaus wählt. Ich nenne sie ab sofort den "Array-Spalten-Aufbau" im Gegensatz zum "Array-Block-Aufbau", der es nun wiederum ohne spezielle Funktion ermöglichen würden einen "Datensatz" hinzuzufügen oder zu entfernen.

          Da aber die ganze Webprogrammierung sich von ihrer Konstruktion her bereits als "objektorientiert" darstellt, halte ich vier kleine Funktionen für select, insert, update, und delete nicht zuviel verlangt, um in einem Monster-Array die "Sätze" zu bearbeiten.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau