На основании ответа Ugo Méda :
Эта версия
- позволяет использовать его исключительно как геттер (оставить исходный массив без изменений)
- исправляет проблему фатальной ошибки, если встречается значение не из массива (
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',
),
)
Использовать как геттер
$val = arrayPath($a, ['foo','bar']); // returns 'new value' / $a remains the same
Установить нулевое значение
$v = null; // assign null to variable in order to pass by reference
$prevVal = arrayPath($a, ['foo','bar'], $v);
$prevVal
- это "новое значение"
$a
сейчас
array(
'foo' => array(
'bar' => null,
),
)
/**
* set/return a nested array value
*
* @param array $array the array to modify
* @param array $path the path to the value
* @param mixed $value (optional) value to set
*
* @return mixed previous value
*/
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)) {
// value param was passed -> we're setting
$ref = $value; // set the value
}
return $prev;
}