Come Jon ha suggerito (e chiedendo feedback per la chat), un alias di riferimento/variabile è utile qui per attraversare lo stack dinamico di chiavi. Quindi l'unica cosa necessaria è per iterare su tutte le sottochiavi e, infine, impostare il valore:
$rv = &$target;
foreach(explode('.', $key) as $pk)
{
$rv = &$rv[$pk];
}
$rv = $value;
unset($rv);
Il riferimento rende possibile l'uso di una pila al posto di ricorsione che è generalmente più magra. Inoltre, questo codice impedisce di sovrascrivere gli elementi esistenti nell'array $target
. esempio completo:
$key = "Main.Sub.SubOfSub";
$target = array('Main' => array('Sub2' => 'Test'));
$value = "SuperData";
$rv = &$target;
foreach(explode('.', $key) as $pk)
{
$rv = &$rv[$pk];
}
$rv = $value;
unset($rv);
var_dump($target);
uscita:
array(1) {
["Main"]=>
array(2) {
["Sub2"]=>
string(4) "Test"
["Sub"]=>
array(1) {
["SubOfSub"]=>
string(9) "SuperData"
}
}
}
Demo
Question (s) correlati:
$ tmp_array = explode ('.', $ Your_string); Quindi itera su $ tmp_array e crea il tuo array $ k – djot
Dai un'occhiata a http://php.net/manual/en/function.explode.php e http://php.net/manual/en/function.implode .php e sei quasi a casa. – Cyclonecode
Domanda simile, solo per un oggetto 'stdClass', non array: [Matrice su oggetto] (http://stackoverflow.com/q/11188563/367456). – hakre