Как в PHP создать многомерный массив из строки по разделителю?

программирование математика php алгоритм массив

Массив A имеет вид:

array("aa_bb_cc" => 123, "dd_ee" => 456, ...)

Нужно превратить его в массив B вида:

array("aa" => array("bb" => array("cc" => 123))), "dd"=>array("ee" => 456), ...)

Уровней вложенности может быть сколько угодно, разделитель только "_"

Примечание:
Один вариант есть. Мое решение было таким:
$A = array("aa_bb_cc" => 123, "dd_ee" => 456);

foreach ($A as $field => $value) {
$arr = explode("_", $field);
$str = '$B';
for ($i = 0; $i < count($arr); $i++) {
$str .= '[$arr[' . $i . ']]';
}
$str .= "='" . $value . "';";
eval($str);
}
echo print_r ($B, true);

Минус его в том, что $value = null заменяется на пустую строку

Надеюсь, кто-нибудь предложит более изящное решение
Ответы:
массив A превратить в массив A1 вида  array("aa_bb_cc_123", "dd_ee_456")
по каждому элементу A1 пройтись сплитом, и по каждому из вхождений рекурсивно создать внутренний массив
типа
function refact(&$elem, &$split) {
 if(count($split)){
  $ename = array_shift($split);
  $elem [$ename] = array();
  refact($elem [$ename], $split);
 }
}
> Примечание №1
$value = null заменяется на пустую строку
ну можно же добавить проверку if( is_null($value) ) {$str .= "=null;";} else {...}
а вот возможность наличия структур вида  $A = array("aa_bb_cc" => 123, "dd_ee" => " '. strlen('5') .' "); сведет на нет все изящество


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.