【问题标题】:PHP, string of keys access valuesPHP,键访问值的字符串
【发布时间】:2011-06-26 17:49:54
【问题描述】:

用这个拔掉我的头发,请帮忙

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

【问题讨论】:

  • 你有理由sprintf那个字符串吗?
  • print_r($access) 获取更多信息并在此处输出该信息??
  • sprintf,只是我 C 时代的旧编程

标签: php string multidimensional-array


【解决方案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;
}

【讨论】:

    【解决方案2】:

    如果您信任 $access,您可以使用 eval。如果没有,你必须解析 $access...

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 2013-09-14
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多