Это похоже на главного кандидата на рекурсию.
Базовый подход выглядит примерно так:
- создать массив ключей
- создать массив для каждого ключа
- если ключей больше нет, вернуть значение (вместо массива)
Рекурсия, приведенная ниже, делает именно это, во время каждого вызова создается новый массив, первый ключ в списке назначается в качестве ключа для нового значения. На следующем шаге, если остаются ключи, процедура повторяется, но если ключей не осталось, мы просто возвращаем значение.
$keys = explode('--', key($in));
function arr_to_keys($keys, $val){
if(count($keys) == 0){
return $val;
}
return array($keys[0] => arr_to_keys(array_slice($keys,1), $val));
}
$out = arr_to_keys($keys, $in[key($in)]);
Для вашего примера приведенный выше код будет оцениваться как нечто эквивалентное этому (но будет работать для общего случая любого количества --
разделенных элементов):
$out = array($keys[0] => array($keys[1] => array($keys[2] => array($keys[3] => 'value'))));
Или, в более определенном смысле, он строит следующее:
$out = array('a' => array('b' => array('c' => array('d' => 'value'))));
Что позволяет вам получить доступ к каждому подмассиву через нужные вам индексы.