depp: zählen der "Ebenen" eines Arrays

moin
wie kann ich mit ner funktion rauskriegen, dass z.b. $arr['1']['ebene2']['e3'] über drei "ebenen" verfügt? konnte nix passendes finden.
danke für tipps

  1. Hi depp,

    wie kann ich mit ner funktion rauskriegen, dass z.b. $arr['1']['ebene2']['e3'] über drei "ebenen" verfügt?

    Ich würde die Funktion array_count_levels() nehmen. [1]

    [1] Du musst dir diese Funktion allerdings erst selber schreiben ;-)
        Was du dazu brauchst:
        - Foreach Schleife
        - Kontrollstruktur if
        - is_array()
        - und das ganze rekursiv aufbauen.

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Man sollte nie aufhören zu fragen (Alber Einstein)
    ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P
    1. das ganze is natürlich nicht optimiert o.ä. aber es scheint zu gehen:
      function letzte_ebene_nr($arr, $ebene=0)
      {
      if(is_array($arr))
      {
              foreach($arr AS $arr_)
              {
                  $rueckgabe=letzte_ebene_nr($arr_,$ebene+1);
              }
          }
          else
          {
           $rueckgabe=$ebene;
          }
      return $rueckgabe;
      }

      echo letzte_ebene_nr($test_array);

      1. hallo nochmal.
        war noch grundlegend verbesserungsbedürftig. hier ne bessre variante der funktion:
        function letzte_ebene_nr($arr, $ebene=0)
        {
        if(is_array($arr))
        {
                foreach($arr AS $arr_)
                {
                 $aktion=letzte_ebene_nr($arr_,$ebene+1);
           if($aktion>$rueckgabe)
                     $rueckgabe=$aktion;
                }
            }
            else
            {
             $rueckgabe=$ebene;
            }
        return $rueckgabe;
        }

  2. Hallo depp,

    wie kann ich mit ner funktion rauskriegen, dass z.b. $arr['1']['ebene2']['e3'] über drei "ebenen" verfügt? konnte nix passendes finden.

    Eine eigenen Funktion gibt es dafür nicht, also musst du selber ran:

    Beispielsweise setzt du zunächst eine Variabel $found = FALSE; und durchläufst per ForEach das Array, bis du ein Element findest, dass selber ein Array ist. Dort wiederholst du die Suche usw. Wenn du irgendwann dann auf ein Unter-Array stößst, was deiner gesuchten Ebene entspricht, dann setzt du $found = TRUE; und kannst du Schleifen terminieren lassen. Ist nun nach allen Schleifen $found == TRUE, dann hat das Array die gesuchte Anzahl an Ebenen.

    Ich hoffe, das hilft dir weiter, Lucas

  3. echo $begrüßung;

    wie kann ich mit ner funktion rauskriegen, dass z.b. $arr['1']['ebene2']['e3'] über drei "ebenen" verfügt? konnte nix passendes finden.

    So etwas gibt es nicht, weil ein Array unter PHP weder mehrdimensional ist noch über mehrere Ebenen geht oder wie auch immer man das ausdrücken will.

    Ein Array besteht lediglich aus Elementen, die aber beliebigen Typs sein können. Ein Element kann ein Array sein (dessen Elemente wiederum vom Typ Array sein können). Ein Element kann aber auch ein Objekt sein. Diese Verschachtelungen können beliebig flach oder tief sein.

    Um die maximale Anzahl dieser Verschachtelungen zu ermitteln, brauchst du

    • eine Variable, die die bisherige maximale Verschachtelungstiefe festhält, initialisiert mit 0
        Dafür bietet sich eine statische Variable innerhalb der folgend erläuterten Funktion an.
         static $maxlevel = 0;

    • eine Funktion, die als Parameter ein Array und einen Level-Zähler, vorbelegt mit 1, erwartet.
        function array_level_count($array, $level = 1) {...}

    • Der erste Aufruf übergibt nur das Array; (damit geht $level in die erste Runde mit dem Default-Wert)

    • Wenn $level größer als $maxlevel ist: $level in $maxlevel ablegen

    • jedes Element des Arrays durchlaufen

    • Wenn es ein Array ist, array_level_count mit dem Element und $level + 1 als Parameter aufrufen

    • Der Rückgabewert der Funktion ist $maxlevel. Innerhalb der rekursiven Aufrufe ist er belanglos, aber als Endergebnis wirst du ihn dann haben wollen. :-)

    Wenn du PHP5 hast, kannst du auch was mit array_walk_recursive() zusammenbauen.

    echo "$verabschiedung $name";