我无法找到简单地解析字符串输入并在多维数组中找到正确位置的方法。
我希望有一两行可以做到这一点,因为我看到的解决方案依赖于长(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
是否可以简单地使用内置函数或其他简单的东西来重新创建我想要的输出?
答案 0 :(得分:5)
考虑$vars
是您的变量,您希望从(Demo)获得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!
这会将字符串变为 key 标记,然后在$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
答案 1 :(得分:2)
怎么样
$vars = array(
'one' => array(
'one-one' => "hello",
'one-two' => "goodbye"
),
'two' => array(
'two-one' => "foo",
'two-two' => "bar"
)
);
function get( $string, $vars )
{
$keys = explode( '][', substr( $string, 1, -1 ) );
foreach( $keys as $key ) {
$vars = $vars[$key];
}
return $vars;
}
echo get( '[two][two-one]', $vars );
答案 2 :(得分:0)
首先,您的$var
功能中没有get()
。 $ var是在函数外定义的,并且PHP作用域规则不会在较低的作用域中显示“更高”的变量,除非明显在较低的作用域中使用全局变量:
function get($string) {
global $vars;
eval('$x = $vars' . $string);
return $x;
}
get("['two']['two-two']");
可能有用,但是没有经过测试,使用eval几乎总是一个非常糟糕的主意。
答案 3 :(得分:0)
Kohana有一个很好的Config类,允许这样的东西:
echo Config::get("two.two-two");