动态数组键添加

时间:2009-12-29 15:58:31

标签: php arrays recursion key-value

这是我的预制...

$keys = array('a', 'b', 'c', 'd');
$number = 10;

这是我的代码......

eval('$array[\''.implode('\'][\'',$keys).'\'] = $number;');

使用这个,我得到以下结果......

Array (
    [a] => Array
        (
            [b] => Array
                (
                    [c] => Array
                        (
                            [d] => 10
                        )
                )
        )
)

现在,问题是这是我想要的确切结果,但我不想使用eval()

作为我的代码的输入,我有一个keys和一个number的列表。 number应设置为keys数组的值,该数组用于为特定数组keys生成基于子项的$array

我能以不同的方式实现这一目标吗?我不想在代码有效的情况下用新值覆盖键/数字 - eval()已经保留了它,所以我的新代码也应该这样做。

3 个答案:

答案 0 :(得分:3)

请注意,下面的代码(您评估的代码)会生成警告,因此不会对错误报告最多的项目起作用:

$array = array();
$array['a']['b'] = 42; // $array['a'] is not an array... yet

由于您使用的是PHP 5,因此您可以在遍历要修改的树分支时使用引用来操作数组。

$current = & $array;

foreach ($keys as $key):

  if (!isset($current[$key]) || !is_array($current[$key]))
    $current[$key] = array();

  $current = & $current[$key];

endforeach;

$current = $value;

编辑:已针对避免警告和冲突进行了更正。

答案 1 :(得分:1)

这是一个完整的代码示例,展示了它的工作原理。重要的是你使用对数组的引用,以便你可以修改它:

<?php
    $keys = array('a', 'b', 'c', 'd'); 
    $number = 10;

    $org_array = array(
        "a" => "string",
        "z" => array( "k" => false)
      );

    function write_to_array(&$array, $keys, $number){
      $key = array_shift($keys);
      if(!is_array($array[$key])) $array[$key] = array();
      if(!empty($keys)){
        write_to_array($array[$key], $keys, $number);
      } else {
        $array[$key] = $number;
      }
    }

    write_to_array($org_array, $keys, $number);

    print_r($org_array);
?>

答案 2 :(得分:1)

function deepmagic($levels, $value)
{
    if(count($levels) > 0)
    {
        return array($levels[0] => deepmagic(array_slice($levels, 1),
            $value));
    }
    else
    {
        return $value;
    }
}

$a = deepmagic(Array('a', 'b', 'c', 'd'), 10);

var_dump($a);

输出:

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        ["d"]=>
        int(10)
      }
    }
  }
}