PHP,字符串键访问值



用这个把我的头发拔出来,请帮助

我有一个阵列$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。。。

相关内容

  • 没有找到相关文章

最新更新