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

标签 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

是否可以简单地使用内置函数或其他简单的方法来重新创建我想要的输出?

最佳答案

考虑到 $vars 是您希望获得 one['one-one']two['two-two'][' 的变量更多'] 来自 ( Demo ):

$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!

这会将字符串词法分析为 key 标记,然后遍历 keyed 值上的 $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

如果您不喜欢 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

关于php - 使用字符串访问(可能很大)多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7003559/

相关文章:

php - SQL UPDATE 如果密码正确

php - MYSQL数据库设计序列化与否

c 打印字符串语法

javascript - 如何更改具有特定 url 的所有 href?

ruby-on-rails - Ruby - 为什么这个构造返回零?

python - 用于更快的 Python 字典查找的预哈希字符串键?

javascript - 多个自定义帖子上的不同图标( acf+google map )

PHP Inotify 非阻塞方式

javascript - 在循环内延迟添加新对象到数组

c++ - 如何在 C++ 中有效地检查一个单词的所有字母是否相同