我无法找到一种方法来简单地解析字符串输入并在多维数组中找到正确的位置。
我希望用一两行代码来完成此操作,因为我见过的解决方案依赖于长(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/