мой вариант
function &ap(&$input, $path = null, $set_value = null)
{
if ( !is_null($path) )
{
if ( !is_array($path) )
{
$path = p2a($path);
}
$node = &$input;
if ( !is_null($set_value) )
{
foreach ( $path as $segment )
{
if ( !isset($node[$segment]) || !is_array($node[$segment]) )
{
$node[$segment] = false;
}
$node = &$node[$segment];
}
$node = $set_value;
return $node;
}
else
{
foreach ( $path as $segment )
{
isset($node[$segment]) || $node[$segment] = null;
$node = &$node[$segment];
}
return $node;
}
}
else
{
return $input;
}
}
function p2a($path, $separator = false)
{
if ( $path === false || $path === '' )
{
return array();
}
else
{
if ( $separator )
$separator = '/' . $separator . '/';
else
$separator = '/';
return explode($separator, $path);
}
}
использование:
получить значение узла
ap($array, 'path/to/node');
вернет $array['path']['to']['node'] или null если не существует
создать/заменить значение узла
ap($array, 'path/to/node', 'klmn');
сделает $array['path']['to']['node'] = 'klmn'
получить ссылку на узел
$link = &ap($array, 'path/to/node');
$link = 123;
$array['path']['to']['node'] станет = 123
есть один небольшой баг в виде создавания узлов со значением равным пустому массиву, к которым обращались, но которых не существовало
и нельзя обращаться (при записи) к узлу путь к которому лежит через заданное скалярное значение, то есть если path/to/node = 123, то нельзя создать узел path/to/node/some. ну тут логика вселенной, тут мои полномочия как бы всё
числовые сегменты можно использовать тоже