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

6

关于我之前提出的问题:使用另一个数组搜索多维数组的键

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

例如:

$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...
    }
}

您可以使用引用来遍历数组中任意数量的键。 - mario
3个回答

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';

你可以通过直接省略 explode 调用,使用数组来代替 $path


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

这个方法很好,除非最后一个键不存在,而在我的情况下它不存在。我会收到错误信息“致命错误:无法创建对字符串偏移量或重载对象的引用”,出现在$ref =& $ref[$key];上。我该如何解决这个问题? - Rob Curle
这很奇怪,但对我来说很有效。(从完全空的数组 $cats 开始)可能是因为 "A22"(倒数第二个键)存在于另一个不是数组的东西中。例如字符串?在这种情况下,将 isset() 替换为 is_array() 将有所帮助--但通过用另一个数组替换它,您将失去 "A22" 中的字符串..您能在使用此函数之前发布 print_r($cats) 的输出吗? - Kaii
我已经按照我在示例中提出的更改建议进行了修改,请再试一次。 - Kaii
太棒了!我一直在尝试很多数据组合,但无法找出规律。使用 is_array 解决了这个问题。非常感谢。 - Rob Curle

0

你应该使用引用。

在foreach循环中,我们从一个键移动到另一个键。变量$ 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);
    ?>

除非最后一个键不存在,否则这很有效,但在我的情况下它并不存在。所以我需要添加一个新的键和值对,我该怎么做? - Rob Curle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接