【问题标题】:Setting a value in a multi-dimensional array using an array of keys使用键数组在多维数组中设置值
【发布时间】:2012-01-05 22:51:32
【问题描述】:

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

我想要一种在多维数组(最多 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...
    }
}

【问题讨论】:

标签: php arrays multidimensional-array


【解决方案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]; 上收到错误“致命错误:无法创建对字符串偏移量或重载对象的引用”;我将如何解决这个问题?
  • 很奇怪。这对我很有效。 (从一个完全空的数组 $cats 开始).. 必须是因为“A22”(最后一个键之前的键)作为不同的东西存在,它不是一个数组。例如细绳?在这种情况下,用 is_array() 替换 isset() 会有所帮助——但是你会通过用另一个数组替换它来丢失“A22”中的字符串。你可以在使用这个函数之前发布 print_r($cats) 的输出吗?跨度>
  • 我做了示例中建议的更改,再试一次
  • 太棒了! ...我一直在尝试大量的数据组合,但无法找到一种模式。使用 is_array 已修复它。非常感谢。
【解决方案2】:
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 使用数组。

【讨论】:

    【解决方案3】:

    你应该使用引用。

    在 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);
        ?>
    

    【讨论】:

    • 除非最终密钥不存在,否则效果很好,在我的情况下它不会。所以我需要添加一个新的键值对。我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2011-10-22
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多