【问题标题】:How to dynamically access values in a variably multidimensional array如何动态访问可变多维数组中的值
【发布时间】:2011-09-18 23:01:54
【问题描述】:
$first = array("a", "b" => array("c", "d" => array("e", "f")), "g", "h" => array("f"));
$second = array("b", "d", "f");
$string = "foobar";

鉴于上述代码,我如何在$second 中定义的索引处将$first 中的值设置为$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 的方法。

【问题讨论】:

    标签: php multidimensional-array


    【解决方案1】:

    比这要复杂一些。如果每个级别尚不存在,则必须对其进行初始化。但你的实际问题是:

    • 要添加值的数组位于$ptr,而不是$first
    • $x &amp;= $y$x = $x &amp; $y 的简写(按位与)。你想要的是x = &amp;$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

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 2012-12-24
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2013-01-07
      • 2013-09-01
      相关资源
      最近更新 更多