Viennamade: Baumstruktur & Array & Syntax

Hallo liebe Forumsteilnehmer!

Im Archiv habe ich über PHP-Arrays gelesen. Trotzdem komme ich bei einem Problem nicht weiter:
<img src="http://bitworks.de/~selfHTML/VerzweigtesArray500.gif" border="0" alt="">
(Das Bild ist von Tom, dem eigentlichem, also nicht dem anderen)

Nehmen wir an, auf die Zeichnung bezogen, ich habe einen Array:

obst[0]="Orangen"
obst[1]="Äpfel"
obst[2]="Birnen"
obst[3]="Paradeiser (dt.: "Tomaten":-) )

Das waren die 4 in der Zeichnung nebeneinander stehenden Kästchen. Jetzt will ich den Ast beginnend bei obst[1] mit Apfelsorten befüllen. Also:
obst[1][0]="Macintosh" obst[1][1]="Jakob Fischer" ....

Wie geht das?
Recht herzlichen Dank
Viennamade

  1. Du hast das doch schon selber geschrieben:

    obst[1][0]="Macintosh" obst[1][1]="Jakob Fischer" ....

    $obst[1][0]="macintosh";
    $obst[1][1]="Jakob Fischer";

    also ein 2.Dimensionlaes Array, oder habe ich die Frage falsch verstanden?

    marc

    1. Hallo!

      Du hast das doch schon selber geschrieben:

      Du führst mir vor Augen wie sehr ich auf der Leitung stehe.

      obst[1][0]="Macintosh" obst[1][1]="Jakob Fischer" ....

      $obst[1][0]="macintosh";
      $obst[1][1]="Jakob Fischer";
      also ein 2.Dimensionlaes Array, oder habe ich die Frage falsch verstanden?

      Nein.
      Ich bekomme dieses Schnipsel nicht zum Laufen:

      foreach (listTablesInDB() as $table){
        $i++;
        $trans[$i]=$table;
        unset ($x);
        foreach(listFieldsPerTable($table) as $field) {
          $trans[$i][$x]=$field;
          $x++;
          }
        }

      Bitte um Hilfe!
      Viennamade

      1. Hallo Viennamade,

        foreach (listTablesInDB() as $table){
          $i++;
          $trans[$i]=$table;
          unset ($x);
          foreach(listFieldsPerTable($table) as $field) {
            $trans[$i][$x]=$field;
            $x++;
            }
          }

        bekommst Du denn eine Fehlermeldung?

        1.
        mich machen ja die Funktionen stuzig. Aber, wenn die Arrays zurückgeben mag das vielleicht gehen, obwohl - die Funktion wird ja in jedem Schleifenaufruf neu aufgerufen. Ich würde es jedenfalls nicht so machen.

        2.
        "$trans[$i]=$table;" Hier schreibst Du die erste Dimension deines Feldes schon voll - womit? Wenn das nicht wieder ein Array ist, kannst Du die Werte nicht mit "$trans[$i][$x]=$field;" überschreiben.

        Ich vermute (auch nach den Antworten der anderen), Du willst sowas haben:

        $Obst = array();
        $Obst['Aepfel'][0] = 'Gravensteiner';
        $Obst['Aepfel'][1] = 'Boskop';
        $Obst['Bananen'][0] = 'Chiquita';
        $Obst['Bananen'][1] = 'Dole';
        $Obst['Bananen'][2] = 'REWE-Standard';
        ...

        lies mal unter "assoziatives Array".

        Lösung _etwa_ so:

        $Arten = array('Aepfel','Bananen'...);
        $Obst = array();

        foreach ($listTablesInDB as $table)
        {
           $i++;
           $Obst[$Arten[$i]]=array();

        foreach($listFieldsPerTable as $field)
           {
              $Obst[$Arten[$i]][$x]=$field;
              $x++;
           }
        }

        Gruß, Andreas

        --
        <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
        http://was-ist-das.andreas-lindig.de
    2. Hello,

      da

      $_obst[1] == "Äpfel"    (Vergleich)

      bereits mit einem String belegt ist, wirst Du es sicherheitshalber erst mit dem neuen Datentyp initialisieren:

      $_obst[1] = array();

      oder gleich

      $_obst[1] = array(1=>'Mac', 2=>'Grafensteiner', 3=>'Granny Smith');

      Die direkte implizite Zuweisung kann Probleme bereiten, wenn das Arrayelement bereits mit etwas anderem als false oder null belegt ist, wird aber garantiert Schwierigkeiten machen, wenn man versucht, mehrere Hierarchiestufen auf einmal implizit in die Struktur einzuhängen.

      $_obst[1][1]['name']='Boskop';

      wird also nicht funktionieren, wenn der zukünftige Knoten $_obst[1] bereits mit einem Skalar belegt ist.

      Ich hoffe, ich konnte zur Verdeutlichung beitragen und nicht zur Verwirrung.

      PS:
      Ich habe mit übrigens angewöhnt, Array-Bezeichner mit Dollar-Unterstich-Name also $_obst zu kennzeichnen gegenüber Skalarbezeichnnern wie $name. Das hat sich bewährt.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Hallo Tom,
        Danke für Deine Infos.

        oder gleich
          $_obst[1] = array(1=>'Mac', 2=>'Grafensteiner', 3=>'Granny Smith');

        Diese Möglichkeit hat mir am meisten zugesagt.

        Die direkte implizite Zuweisung kann Probleme bereiten, wenn das Arrayelement bereits mit etwas anderem als false oder null belegt ist, wird aber garantiert Schwierigkeiten machen, wenn man versucht, mehrere Hierarchiestufen auf einmal implizit in die Struktur einzuhängen.

        Jo :-) wenn ich das schon früher gewußt hätte ....

        Ich hoffe, ich konnte zur Verdeutlichung beitragen und nicht zur Verwirrung.

        Nun, die nötige Portion "self" hast Du - aus meiner Sicht - mir übergelassen - wie die Uhrzeit dieses Postings zeigt :-)

        Ich habe mit übrigens angewöhnt, Array-Bezeichner mit Dollar-Unterstich-Name also $_obst zu kennzeichnen gegenüber Skalarbezeichnnern wie $name. Das hat sich bewährt.

        Besten Dank
        Viennamade