用这个把头发拉出来,请帮忙
我有一个数组$address
$access=sprintf("['results'][1]['address_components'][1]['long_name']");
我希望能够使用字符串从数组中获取数据,即
$home=$address[$access]
还有probs
print_r($address['results'][1]['address_components'][1]);
$key=sprintf("[results][1][address_components][1][long_name]");
printf("key=%s\n", $key);
$home = eval($address . $key);
exit;
---返回
Array
(
[long_name] => High St
[short_name] => A4151
[types] => Array
(
[0] => route
)
)
key=[results][1][address_components][1][long_name]
PHP Parse error: syntax error, unexpected '[', expecting '(' in /media/www.h.com.dev/postCode/post.php(72) : eval()'d code on line 1
答案 0 :(得分:1)
如果您在$access
中没有任何用户提供的输入,则可以安全地使用eval()
...
$home = eval("return \$address{$access}");
请注意,在执行eval()
时,您将代码作为字符串传递。因此,您需要确保将$address
作为实际字符串传递,而不是作为变量传递(使用单引号'
或转义双引号字符串中的美元符号\$
);至于$access
,你希望将其解析为代码,以便简单地连接它。
如果您确实有用户提供的输入,则必须解析$access
。您可以使用token_get_all()
解析$access
。
function array_get_node($array, $nodePath) {
$nodePath = '<?php ' . $nodePath;
$tokens = token_get_all($nodePath);
array_shift($tokens);
$current = $array;
$moved = false;
var_dump($tokens);
$tokCount = count($tokens);
for($i = 0; $i < $tokCount; $i++) {
if($tokens[$i] === '[' && isset($tokens[$i+2])
&& $tokens[$i+2] === ']' && is_array($tokens[$i+1])) {
$node = null;
switch($tokens[$i+1][0]) {
case T_LNUMBER:
$node = (int) $tokens[$i+1][1];
break;
case T_CONSTANT_ENCAPSED_STRING:
$node = preg_replace('#^[\'"](.*)[\'"]$#', '\1', $tokens[$i+1][1]);
break;
case T_STRING:
$node = $tokens[$i+1][1];
break;
default:
return null;
break;
}
if(!isset($current[$node])) return null;
$current = &$current[$node];
$moved = true;
$i+=2;
}
}
if($moved)
return $current;
return null;
}
答案 1 :(得分:0)
如果您信任$ access,则可以使用eval
。如果没有,你必须解析$ access ...