Преобразование плоского массива в иерархический многомерный массив

У меня есть стандартный массив с парами ключ-значение – и я хочу использовать ключи для преобразования его в многомерный массив. Трудность, похоже, в том, что мне нужно рекурсивно цитировать неизвестное количество новых ключей и превратить их в многомерный массив. Короче говоря, я хочу:

$val[alfa.xray.uno] = "Some value"; => $val['alfa']['xray']['uno'] = "Some value"; 

Пример: (Код не работает и также должен обрабатывать N измерений, но вы получаете идею ..)

 $arr['alfa.xray.uno'] = "Alfa X-Ray Uno"; $arr['alfa.yaho.duo'] = "Alfa Yaho Duo"; $arr['beta.xray.uno'] = "Beta X-Ray Uno"; $arr['beta.xray.duo'] = "Beta X-Ray Duo"; $arr['just-me'] = "Root-level item"; print_r( array_flat_to_multidimensional($arr) ); function array_flat_to_multidimensional($arr) { foreach($arr as $key=>$val) { $key = explode(".",$key); for($i=0; $i<count($key); $i++) { if($i==0) { $out[$key[$i]] = $val; } else if($i==1) { $out[$key[$i-1]][$key[$i]] = $val; } else if($i==2) { $out[$key[$i-2]][$key[$i-1]][$key[$i]] = $val; } else if($i==3) { $out[$key[$i-3]][$key[$i-2]][$key[$i-1]][$key[$i]] = $val; } } } return $out; } 

Возможно, RecursiveArrayIterator сделает трюк?

Related of "Преобразование плоского массива в иерархический многомерный массив"

Вы можете использовать ссылки для последовательной итерации и создания структуры вложенных массивов:

 $out = array(); foreach ($arr as $key=>$val) { $r = & $out; foreach (explode(".", $key) as $key) { if (!isset($r[$key])) { $r[$key] = array(); } $r = & $r[$key]; } $r = $val; } return $out; 

используйте рекурсию Luke

 function ins(&$ary, $keys, $val) { $keys ? ins($ary[array_shift($keys)], $keys, $val) : $ary = $val; } // test $arr['alfa.xray.uno'] = "Alfa X-Ray Uno"; $arr['alfa.yaho.duo'] = "Alfa Yaho Duo"; $arr['beta.xray.uno'] = "Beta X-Ray Uno"; $arr['beta.xray.duo'] = "Beta X-Ray Duo"; $arr['just-me'] = "Root-level item"; $a = array(); foreach($arr as $k => $v) ins($a, explode('.', $k), $v); print_r($a); 

Вы можете использовать ссылку при ходьбе, используя уровни иерархии массива:

 function array_flat_to_multidimensional($arr) { $out = array(); foreach ($arr as $compondKey => $val) { $ref = &$out; foreach (explode(".", $compoundKey) as $key) { if (!array_key_exists($key, $ref)) $ref[$key] = array(); $ref = &$ref[$key]; } $ref = $val; } unset($ref); return $out; } с function array_flat_to_multidimensional($arr) { $out = array(); foreach ($arr as $compondKey => $val) { $ref = &$out; foreach (explode(".", $compoundKey) as $key) { if (!array_key_exists($key, $ref)) $ref[$key] = array(); $ref = &$ref[$key]; } $ref = $val; } unset($ref); return $out; }