PHP:使用变量作为键设置嵌套数组的值

11
假设我有以下代码:

Lets say i have this kind of code:

    $array = [
        'a'=> [
            'b' => [
                'c'=>'some value',
            ],
        ],
    ];

    $array['a']['b']['c'] = 'new value';

这当然可以运行,但我想要的是使用变量更新这个“c”键,类似于这样:

$keys = '[a][b][c]';
$array{$keys} = 'new value';

但是键被视为字符串,这就是我得到的内容:

$array['[a][b][c]'] = 'new value';

我希望能够得到一些帮助,让我知道如何在不使用eval()的情况下使它正常工作。

顺便说一下,可能会有任意数量的数组嵌套,因此像这样的东西不是一个好答案:

$key1 = 'a';
$key2 = 'b';
$key3 = 'c';
$array[$key1][$key2][$key3] = 'new value';
3个回答

13

这不是定义键的最佳方式,但是:

$array = [];
$keys = '[a][b][c]';
$value = 'HELLO WORLD';

$keys = explode('][', trim($keys, '[]'));
$reference = &$array;
foreach ($keys as $key) {
    if (!array_key_exists($key, $reference)) {
        $reference[$key] = [];
    }
    $reference = &$reference[$key];
}
$reference = $value;
unset($reference);

var_dump($array);
如果你需要在一个字符串中定义一系列键,那么使用一个简单的分隔符并进行分割,而不需要修剪来构建一个单独的键数组会更简单,因此像 a.b.c 这样的东西将更容易使用,而不是 [a][b][c]演示

谢谢,这正是我需要的。是的,我使用join()将键定义为字符串,例如a.b.c。如果有人需要代码,可以使用以下函数: function keyArray($array = [], array $path = []) { $result = array(); foreach ($array as $key => $val) { $currentPath = array_merge($path, array($key)); if (is_array($val)) { $result = array_merge($result, keyArray($val, $currentPath)); } else { $result[] = join('.', $currentPath); } } return $result; } - grinry
@mark 你可以使用空值合并赋值运算符来使这个更现代化。 - undefined

11

最简单的方法是使用set方法来自这个库

Arr::set($array, 'a.b.c', 'new_value');

或者,如果您的键是数组,可以使用以下形式:

Arr::set($array, ['a', 'b', 'c'], 'new_value');

4

你好,您可以通过一个键数组来实现这个操作:

以下是您的数组结构:

$array = array(
    'a'=> array(
        'b' => array(
            'c'=>'some value',
        ),
    ),
);

这是获取动态键数组值的PHP代码:
$result = $array; //Init an result array by the content of $array

$keys = array('a','b','c'); //Make an array of keys

//For loop to get result by keys
for($i=0;$i<count($keys);$i++){
    $result = $result[$keys[$i]];
}

echo $result; // $result = 'new value'

我希望这个答案能帮到你,这里是你工作代码的PHPFiddle链接。

2
你太棒了!我一直在寻找检索内部数组的方法! - Christopher Smit

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