使用字符串来访问(可能很大)多维数组

roc*_*est 2 php arrays string multidimensional-array

我无法找到一种简单地解析字符串输入并在多维数组中找到正确位置的方法.

我希望有一两行可以做到这一点,因为我看到的解决方案依赖于长(10-20行)循环.

给出以下代码(注意,理论上,嵌套可以是任意深度):

function get($string)
{
    $vars = array(
        'one' => array(
            'one-one' => "hello",
            'one-two' => "goodbye"
        ),
        'two' => array(
            'two-one' => "foo",
            'two-two' => "bar"
        )
    );

    return $vars[$string]; //this syntax isn't required, just here to give an idea
}

get("two['two-two']");  //desired output: "bar".  Actual output: null
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的使用内置函数或其他简单的东西,可以重新创建我想要的输出?

hak*_*kre 5

考虑$vars为您的变量,你想获得one['one-one']two['two-two']['more']从(演示):

$vars = function($str) use ($vars)
{
    $c = function($v, $w) {return $w ? $v[$w] : $v;};
    return array_reduce(preg_split('~\[\'|\'\]~', $str), $c, $vars);
};
echo $vars("one['one-one']"); # hello
echo $vars("two['two-two']['more']"); # tea-time!
Run Code Online (Sandbox Code Playgroud)

这将字符串变为关键标记,然后在$vars数组转换为函数时遍历键控值上的$vars数组.


旧东西:

使用只是eval的函数重载数组:

$vars = array(
    'one' => array(
        'one-one' => "hello",
        'one-two' => "goodbye"
    ),
    'two' => array(
        'two-one' => "foo",
        'two-two' => "bar"
    )
);

$vars = function($str) use ($vars)
{
    return eval('return $vars'.$str.';');
};

echo $vars("['one']['one-two']"); # goodbye
Run Code Online (Sandbox Code Playgroud)

如果您不是eval的粉丝,请更改实施:

$vars = function($str) use ($vars)
{
    $r = preg_match_all('~\[\'([a-z-]+)\']~', $str, $keys);
    $var = $vars;
    foreach($keys[1] as $key)
        $var = $var[$key];
    return $var;
};
echo $vars("['one']['one-two']"); # goodbye
Run Code Online (Sandbox Code Playgroud)