PHP,密钥字符串访问值

时间:2011-06-26 17:49:54

标签: php string multidimensional-array

用这个把头发拉出来,请帮忙

我有一个数组$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

2 个答案:

答案 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 ...