假设我有以下多维数组:
$fruits['apple']['name'] = 'macintosh';
有没有办法在单个变量中引用整个关键路径?
我想以某种方式执行以下操作:
$path = "['apple']['name']";
echo $fruits[$path];
//output would be "macintosh"
假设我有以下多维数组:
$fruits['apple']['name'] = 'macintosh';
有没有办法在单个变量中引用整个关键路径?
我想以某种方式执行以下操作:
$path = "['apple']['name']";
echo $fruits[$path];
//output would be "macintosh"
有没有办法在单个变量中引用整个关键路径?
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'
显然有一种可怕的、永远不会使用的方法: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
存储在数组中的值。
J Brun 的 #3 答案是您最好的选择,但是,他的答案不正确,因为他演示了按位与运算符 (&=) 而不是引用赋值。这是更正后的代码:
$fruits['apple'] = array( 'name' => 'macintosh' );
$path = &$fruits['apple']['name'];
echo $path; // outputs 'macintosh';
参考可能是您需要的:
$path = &$fruits['apple']['name'];
现在每次访问$path
时$fruits['apple']['name']
,都会使用(或更改等)的值。
您想要做的事情不是直接可能的 - 如果变量被链接起来,那将是模棱两可的。
您将需要编写一个访问器函数,例如
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);