使用键数组在多维数组中设置值

时间:2011-11-24 21:28:09

标签: php arrays multidimensional-array

关于这个问题我先前问过:Searching multi-dimensional array's keys using a another array

我想要一种在多维数组中设置值的方法(最多6级),使用包含要使用的键的单独数组。

e.g。

$keys = Array ('A', 'A2', 'A22', 'A221');
$cats[A][A2][A22][A221] = $val;

我尝试写一个笨拙的开关但收效甚微......是否有更好的解决方案?

function set_catid(&$cats, $keys, $val) {
    switch (count($keys)) {
        case 1: $cats[$keys[0]]=$val; break;
        case 2: $cats[$keys[0]][$keys[1]]=$val; break;
        case 3: $cats[$keys[0]][$keys[1]][$keys[2]]=$val; break;
        etc...
    }
}

3 个答案:

答案 0 :(得分:1)

function insertValueByPath($array, $path, $value) {
    $current = &$array;
    foreach (explode('/', $path) as $part) {
        $current = &$current[$part];
    }
    $current = $value;

    return $array;
}

$array = insertValueByPath($array, 'A/B/C', 'D');
// => $array['A']['B']['C'] = 'D';

显然,您只需删除$path电话即可为explode使用数组。

答案 1 :(得分:1)

试试这个:

function set_catid(&$cats, $keys, $val) {
  $ref =& $cats;
  foreach ($keys as $key) {
    if (!is_array($ref[$key])) {
      $ref[$key] = array();
    }
    $ref =& $ref[$key];
  }
  $ref = $val;
}

答案 2 :(得分:0)

你应该使用参考文献。

在foreach中,我们正在从一个键移动到另一个键。 Var $ temp是对数组$ cat的当前元素的引用。最后,temp是我们需要的元素。

   <?php

    function set_catid(&$cats, $keys, $val) {
        $temp = &$cats;
        foreach($keys as $key) {
            $temp = &$temp[$key];
        }

        $temp = $val;
    }

    $cats = array();
    $keys = Array ('A', 'A2', 'A22', 'A221');
    set_catid($cats, $keys, 'test');
    print_r($cats);
    ?>