2

假设我有以下多维数组:

$fruits['apple']['name'] = 'macintosh';

有没有办法在单个变量中引用整个关键路径?

我想以某种方式执行以下操作:

$path = "['apple']['name']";
echo $fruits[$path];

//output would be "macintosh"
4

5 回答 5

3

有没有办法在单个变量中引用整个关键路径?

1)以这样的方式:$fruits[$variable],答案是否定的,没有

当然,有几种方法可以将单个 $variable 拆分为两个或多个,然后分别使用它的各个部分 ( $fruits[$part1][$part2])

这是一个通用的解决方案:

function get_path($array, $path)
{
    $value = $array;
    $parts = explode("']['", trim($path, "[']"));
    foreach($parts as $key)
    {
        $value = $value[$key];
    }
    return $value;
}

$fruits['apple']['name'] = 'macintosh';
$path = "['apple']['name']";
echo get_path($fruits, $path);

// output = 'macintosh'

2)正如还指出的那样,您可以使用“eval”,不建议这样做:

$fruits['apple']['name'] = 'macintosh';
$path = "['apple']['name']";
eval('echo $fruits' . $path . ';');

// output = 'macintosh'

3)最后,如果您想使用引用变量访问数组的元素,那么只需:

$fruits['apple']['name'] = 'macintosh';
$path &= $fruits['apple']['name'];
echo $path;  // output = 'macintosh'

$path = 'MSX';
echo $fruits['apple']['name'];  // output = 'MSX'
于 2012-06-06T20:28:27.903 回答
1

显然有一种可怕的、永远不会使用的方法:eval()

但如果你真的想做这样的事情,我更喜欢这种方法:

function &array_value_by_address (&$array, $address, $addressSeparator = '/') {
  $parts = explode($addressSeparator, $address);
  $thisLevel = array_shift($parts);
  if (isset($array[$thisLevel])) {
    if ($parts) {
      $ref = &array_value_by_address($array[$thisLevel], implode($addressSeparator, $parts));
      return $ref;
    } else {
      return $array[$thisLevel];
    }
  }
}

由于函数声明中的引用,还可以在变量中捕获返回值并使用它来修改源数组。这是可选的 - 如果您&在调用时省略前缀,则捕获的值将只是一个 copu 而不是引用。

需要注意的是 - 如果数组中的“地址”不存在,函数将返回NULL,但无法区分这种情况和NULL存储在数组中的值。

看到它工作

于 2012-06-06T20:39:07.530 回答
1

J Brun 的 #3 答案是您最好的选择,但是,他的答案不正确,因为他演示了按位与运算符 (&=) 而不是引用赋值。这是更正后的代码:

$fruits['apple'] = array( 'name' => 'macintosh' );

$path = &$fruits['apple']['name'];

echo $path; // outputs 'macintosh';
于 2013-07-08T02:34:57.407 回答
0

参考可能是您需要的:

$path = &$fruits['apple']['name'];

现在每次访问$path$fruits['apple']['name'],都会使用(或更改等)的值。

于 2012-06-06T20:30:10.350 回答
0

您想要做的事情不是直接可能的 - 如果变量被链接起来,那将是模棱两可的。

您将需要编写一个访问器函数,例如

define('SEPARATOR','|');

function getElement($array,$path) {
  $path=explode(SEPARATOR,$path);
  $out=&$array;
  foreach ($path as $step) {
    if (!isset($out[$step])) return null;
    $out=$out[$step];
  }
  return $out;
}

$path="apple|name";
echo getElement($fruits,$path);
于 2012-06-06T20:32:43.983 回答