Martin Dunst: Zugriff auf verschachteltes Array

Hallo,

Gegeben sei folgendes Array:

$aCol = array (  
  'id' =>  
  array (  
    'type' =>  
    array (  
      'group'     => 'numeric',  
      'simple'    => 'integer',  
      'accurate'  => 'int(10) unsigned',  
      'unsigned'  => true,  
      'zerofill'  => false,  
      'len'       => '10'  
    )  
  )  
);  

Nun kann man einen gewünschten Wert im Array zum Beispiel mit $aCol['id']['type']['accurate'] auslesen.

Ich suche nach einer Möglichkeit, mit Hilfe einer Funktion/Methode und eines einzelnen Argumentstrings auf einen beliebigen Wert zuzugreifen.
Zum Beispiel:
$type_acc = getValue('id.type.accurate'); // ergibt 'int(10) unsigned'

Ich habe auch bereits eine Lösung mit eval(), die nur leider *saulangsam* ist.
Hier die relevanten Zeilen:
--

$cmd = "\$re = \$this->items" . $this->DOTParse( 'id.type.accurate') . ";";  
eval( $cmd);

--
(die Methode DOTParse liefert hier den Wert "['id']['type']['accurate']" zurück)

Gibt es eine schnellere Möglichkeit, mit "Punkt-Notation" auf ein verschachteltes Array zuzugreifen?

lg
Martin Dunst

--
Do what I say, not what I do.
--Tim Berners-Lee
  1. hi,

    Gibt es eine schnellere Möglichkeit, mit "Punkt-Notation" auf ein verschachteltes Array zuzugreifen?

    Klar, mach's in einer Schleife - jeweils einen "Schritt" weiter vor gehen.
    Referenzen zu nutzen bietet sich hier vielleicht ausnahmsweise mal an.

    Ob du noch eine Fehlerbehandlung einbauen willst, oder dir "sicher" bist, nur existente Keys zu verwenden, sei dir überlassen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hey,

    eval buuuuuuuh!

    was spricht denn gegen ein langweiliges durchgehen der teilkeys?

      
    function getValue($str)  
    {  
      $aCol = array (  
        'id' =>  
        array (  
          'type' =>  
          array (  
            'group'     => 'numeric',  
            'simple'    => 'integer',  
            'accurate'  => 'int(10) unsigned',  
            'unsigned'  => true,  
            'zerofill'  => false,  
            'len'       => '10'  
          )  
        )  
      );  
      
      $ret = $aCol;  
      
      foreach(explode(".", $str) as $k)  
      {  
        if (isset($ret[$k]))  
        {  
          $ret = $ret[$k];  
        } else {  
          throw new Exception('key '.$k.' does not exist');  
        }  
      }  
      return $ret;  
    }  
      
    echo getValue('id.type.accurate');  
    
    

    Tschö

  3. Hallo,

    Vielen Dank für Eure Hinweise, eine Lösung mit Iteration ist wirklich wesentlich schneller!

    Danke nochmal,

    lg
    Martin Dunst

    --
    Do what I say, not what I do.
    --Tim Berners-Lee