我创建了一个小函数来解析并通过用类Unix路径语法编写的字符串从多维数组中获取元素。
function array_get($path, &$array) {
$keys = preg_split('/[\/\\\]+/', $path, null, PREG_SPLIT_NO_EMPTY);
$current = trim(array_shift($keys));
if (is_array($array) && array_key_exists($current, $array)) {
$path = implode("/", $keys);
if (empty($path)) {
// (Place the code here, see below)
return $array[$current];
}
return array_get($path, $array[$current]);
}
return false;
}
所以,如果我有一个像这样的简单数组
$arr = array(
"A" => array(
"X" => array(),
"Y" => array(),
"Z" => array()
),
"B" => array(
"X" => array(),
"Y" => array(),
"Z" => array()
),
"C" => array(
"X" => array(),
"Y" => array(),
"Z" => array()
)
);
我希望在这些条目中填写
$arr['A']['Z'][] = "foo";
$arr['A']['Z'][] = "bar";
我会使用以下语句做同样的工作:
$var = array_get("A/Z", $arr);
$var[] = "foo";
$var[] = "bar";
但出了点问题。
如果您尝试运行代码,您会注意到超出本地范围对传递的数组的引用将会丢失。
如果您希望运行测试,可以使用以下两个代码行替换函数内的占位符注释行:
$array[$current][] = "foo";
$array[$current][] = "bar";
然后你会看到该函数实际上会执行自己的工作。
有没有办法在输出中维护参考?
答案 0 :(得分:1)
从the documentation开始,您可以指定要在函数名称 AND 之前使用&
字符返回引用。
<?php
function &foo(&$arr) {
return $arr[0];
}
$a = [[]];
$b = &foo($a);
$b[0] = 'bar';
print_r($a); /* outputs [ [ 'bar' ] ] */
答案 1 :(得分:0)
但我觉得你的方法非常麻烦,很快就会导致行为不端/可维护性/可读性问题。