如何动态访问可变多维数组中的值

时间:2011-09-18 23:01:54

标签: php multidimensional-array

$first = array("a", "b" => array("c", "d" => array("e", "f")), "g", "h" => array("f"));
$second = array("b", "d", "f");
$string = "foobar";

鉴于上述代码,如何在$first中将$second中定义的索引中的值设置为$string的内容?意思是,对于此示例,它应该是$first["b"]["d"]["f"] = $string;,但$second$first的内容可以是任意长度。 $second永远是一维的。这是我尝试过的,似乎没有按计划运作:

$key = "";
$ptr = $first;
for($i = 0; $i < count($second); $i++)
{
    $ptr &= $ptr[$second[$i]];
    $key = key($ptr);
}
$first[$key] = $string;

这将执行$first["f"] = $string;而不是正确的多维索引。我原以为使用key会找到数组中的位置,包括它已经向下移动的位置。

如何动态访问正确的密钥?如果维度的数量是静态的,我可以管理它。

编辑:另外,我想要一种不使用eval的方法。

1 个答案:

答案 0 :(得分:9)

比这复杂一点。如果尚未存在,则必须初始化每个级别。但你的实际问题是:

  • 您要添加值的数组位于$ptr,而不是$first
  • $x &= $y$x = $x & $y(按位AND)的简写。你想要的是x = &$y(通过引用分配)。

这应该这样做:

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);
}

用法:

assign($first, $second, $string);

DEMO