根据Ugo Méda的回复:
这个版本
- 允许你仅将其用作getter(不改变源数组)
- 修复了遇到非数组值时的致命错误问题(
Cannot create references to/from string offsets nor overloaded objects
)
无致命错误示例
$a = ['foo'=>'not an array'];
arrayPath($a, ['foo','bar'], 'new value');
$a
现在是
array(
'foo' => array(
'bar' => 'new value',
),
)
作为getter使用
$val = arrayPath($a, ['foo','bar']); // returns 'new value' / $a remains the same
将值设置为null
$v = null; // assign null to variable in order to pass by reference
$prevVal = arrayPath($a, ['foo','bar'], $v);
$prevVal
是 "new value"
$a
现在是
array(
'foo' => array(
'bar' => null,
),
)
function arrayPath(&$array, $path = array(), &$value = null)
{
$args = func_get_args();
$ref = &$array;
foreach ($path as $key) {
if (!is_array($ref)) {
$ref = array();
}
$ref = &$ref[$key];
}
$prev = $ref;
if (array_key_exists(2, $args)) {
$ref = $value;
}
return $prev;
}
$temp
,那么为什么要在它上面一行设置它呢? - Mohd Abdul Mujib$temp
是一个引用,倒数第二行写入了被引用的变量(在这种情况下是嵌套数组项),最后一行移除了引用,因此$temp
不再与该变量相关联。 - alexisdm