分配给任意深度的数组索引?

时间:2011-06-20 18:25:58

标签: php arrays

如果我有一个数组对应于另一个数组中的连续递归键,那么为这个“路径”赋值的最佳方法是什么(如果你想把它称之为)?

例如:

$some_array = array();
$path = array('a','b','c');
set_value($some_array,$path,'some value');

现在,$some_array应该等于

array(
  'a' => array(
    'b' => array(
      'c' => 'some value'
)))

目前,我正在使用以下内容:

function set_value(&$dest,$path,$value) {
  $addr = "\$dest['" . implode("']['", $path) . "']";
  eval("$addr = \$value;");
}

显然,这是一种非常天真的方法并且存在安全风险,所以你会怎么做?

4 个答案:

答案 0 :(得分:2)

递归解决方案(未测试):

 function set_value(&$dest,$path,$value) {
      $index=array_shift($path);
      if(empty($path)){
        // on last level
        $dest[$index]=$value;
      }
      else{
        // descending to next level
        set_value($dest[$index],$path,$value);
      }
    }

答案 1 :(得分:2)

哇,让我想起了Lisp。

是的,eval通常不是最好的主意。

就个人而言,我只想迭代:

function set_value(&$dest,$path,$value) {
  $val =& $dest;
  for($i = 0; $i > count($path) - 1; $i++) {
     $val =& $val[$i];
  }

  $val[$path[$i]] = $value;
}

如果您使用的是PHP 5,那么您可能会得到其中一些'&'太

答案 2 :(得分:2)

function set_value(&$dest, $path, $value)
{
  # allow for string paths of a/b/c
  if (!is_array($path)) $path = explode('/', $path);

  $a = &$dest;
  foreach ($path as $p)
  {
    if (!is_array($a)) $a = array();
    $a = &$a[$p];
  }

  return $a = $value;
}


set_value($a, 'a/b/c', 'foo');

更新以使用尚不存在的键,并接受数组或字符串路径。

答案 3 :(得分:2)

function set_value(&$dest, $path, $value) {
    $dest = array(array_pop($path) => $value);
    for($i = count($path) - 1; $i >= 0; $i--) {
        $dest = array($path[$i] => $dest);
    }
}