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

Ryt*_*ius 5 php arrays nested multidimensional-array

可以说我有这种代码:

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

    $array['a']['b']['c'] = 'new value';
Run Code Online (Sandbox Code Playgroud)

当然,这是可行的,但是我想要的是使用变量来更新此“ c”键,例如:

$keys = '[a][b][c]';
$array{$keys} = 'new value';
Run Code Online (Sandbox Code Playgroud)

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

$array['[a][b][c]'] = 'new value';
Run Code Online (Sandbox Code Playgroud)

因此,我需要一些帮助,以向我展示不使用eval()即可完成此工作的正确方法。

顺便说一下,可以有任意数量的数组嵌套,所以这样的答案不是一个好办法:

$key1 = 'a';
$key2 = 'b';
$key3 = 'c';
$array[$key1][$key2][$key3] = 'new value';
Run Code Online (Sandbox Code Playgroud)

Min*_*ork 8

最简单的方法是使用这个库中的set方法:

Arr::set($array, 'a.b.c', 'new_value');
Run Code Online (Sandbox Code Playgroud)

或者,如果您将键作为数组,则可以使用以下形式:

Arr::set($array, ['a', 'b', 'c'], 'new_value');
Run Code Online (Sandbox Code Playgroud)


Mar*_*ker 5

这不是定义密钥的最佳方法,但是:

$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);
Run Code Online (Sandbox Code Playgroud)

如果您必须像这样在字符串中定义键序列,那么使用一个可以分解的简单分隔符而不是需要修剪也可以构建单个键的数组a.b.c就更简单了,因此更简单的事情会更容易与...合作[a][b][c]

演示版