用这个把我的头发拔出来,请帮助
我有一个阵列$address
$access=sprintf("['results'][1]['address_components'][1]['long_name']");
我希望能够使用字符串(即)从阵列中获取数据
$home=$address[$access]
仍有问题
print_r($address['results'][1]['address_components'][1]);
$key=sprintf("[results][1][address_components][1][long_name]");
printf("key=%sn", $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
如果在$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;
}
如果您信任$access,则可以使用eval
。如果没有,则必须解析$access。。。