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

PHP: Set value of nested array using variable as key

假设我有这种代码:

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

嗨,兄弟,你可以通过一组键来做到这一点:

这是你的数组结构:

$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

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

$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);

如果你必须像这样在一个字符串中定义一个键序列,那么使用一个可以展开的简单分隔符比需要 trim 构建一个单独的数组更简单键,所以像 a.b.c 这样简单的东西比 [a][b][c]

更容易使用

Demo

最简单的方法是使用 set method from this library:

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

或者,如果你有键作为数组,你可以使用这种形式:

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