How to dynamically access values ββin a multi-parameter array
$first = array("a", "b" => array("c", "d" => array("e", "f")), "g", "h" => array("f")); $second = array("b", "d", "f"); $string = "foobar"; Given the code above, how can I set the value in $first in the indices defined in $second to the contents of $string ? The value for this example should be $first["b"]["d"]["f"] = $string; , but the contents of $second and $first can be any length. $second will always be one-dimensional. Here is what I tried, which didn't seem to work as planned:
$key = ""; $ptr = $first; for($i = 0; $i < count($second); $i++) { $ptr &= $ptr[$second[$i]]; $key = key($ptr); } $first[$key] = $string; This will do $first["f"] = $string; instead of the correct multidimensional indexes. I thought using key would find a location in the array, including levels that it had already pushed down.
How can I access the corresponding keys dynamically? I could manage this if the number of measurements was static.
EDIT: Also, I would like to make a method that does not use eval .
It is a little harder than that. You must initialize each level if it does not already exist. But your current problems:
- The array you want to add the value to is in
$ptr, not$first. $x &= $yis shorthand for$x = $x & $y(bitwise AND). You wantx = &$y(assign by reference).
This should do it:
function assign(&$array, $keys, $value) { $last_key = array_pop($keys); $tmp = &$array; foreach($keys as $key) { if(!isset($tmp[$key]) || !is_array($tmp[$key])) { $tmp[$key] = array(); } $tmp = &$tmp[$key]; } $tmp[$last_key] = $value; unset($tmp); } Using:
assign($first, $second, $string);