数组:使用点表示法设置值?

Str*_*rae 13 php arrays eval multidimensional-array

查看Kohana文档,我发现这非常有用,它们用于使用点表示法从多维数组中获取值,例如:

$foo = array('bar' => array('color' => 'green', 'size' => 'M'));
$value = path($foo, 'bar.color', NULL , '.');
// $value now is 'green'
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法以相同的方式设置数组值:

set_value($foo, 'bar.color', 'black');
Run Code Online (Sandbox Code Playgroud)

我发现这样做的唯一方法是重新构建数组表示法($ array ['bar'] ['color'])然后设置值..使用eval.

有什么想法避免评估?

hai*_*sin 38

function set_val(array &$arr, $path,$val)
{
   $loc = &$arr;
   foreach(explode('.', $path) as $step)
   {
     $loc = &$loc[$step];
   }
   return $loc = $val;
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,我相信`strtok`比`爆炸'更好! (2认同)

Jon*_*Jon 9

当然有可能.

代码

function set_value(&$root, $compositeKey, $value) {
    $keys = explode('.', $compositeKey);
    while(count($keys) > 1) {
        $key = array_shift($keys);
        if(!isset($root[$key])) {
            $root[$key] = array();
        }
        $root = &$root[$key];
    }

    $key = reset($keys);
    $root[$key] = $value;
}
Run Code Online (Sandbox Code Playgroud)

如何使用它

$foo = array();
set_value($foo, 'bar.color', 'black');
print_r($foo);
Run Code Online (Sandbox Code Playgroud)

输出

Array
(
    [bar] => Array
        (
            [color] => black
        )

)
Run Code Online (Sandbox Code Playgroud)

看到它在行动.


Med*_*dev 5

请访问https://gist.github.com/elfet/4713488

$dn = new DotNotation(['bar'=>['baz'=>['foo'=>true]]]);

$value = $dn->get('bar.baz.foo'); // $value == true

$dn->set('bar.baz.foo', false); // ['foo'=>false]

$dn->add('bar.baz', ['boo'=>true]); // ['foo'=>false,'boo'=>true]
Run Code Online (Sandbox Code Playgroud)