Zugriff auf verschachteltes Array
Martin Dunst
- php
1 wahsaga1 asdf0 Danke!
Martin Dunst
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
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
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ö
Hallo,
Vielen Dank für Eure Hinweise, eine Lösung mit Iteration ist wirklich wesentlich schneller!
Danke nochmal,
lg
Martin Dunst