Вопрос на засыпку. Есть массив, из которого следует построить многомерный массив-дерево. Как бы вы реализовали? Code: $array[]='Top'; $array[]='Top.Science'; $array[]='Top.Science.Astronomy'; $array[]='Top.Science.Astronomy.Astrophysics'; $array[]='Top.Science.Astronomy.Cosmology'; $array[]='Top.Hobbies'; $array[]='Top.Hobbies.Amateurs_Astronomy'; $array[]='Top.Collections'; $array[]='Top.Collections.Pictures'; $array[]='Top.Collections.Pictures.Astronomy'; $array[]='Top.Collections.Pictures.Astronomy.Stars'; $array[]='Top.Collections.Pictures.Astronomy.Galaxies'; $array[]='Top.Collections.Pictures.Astronomy.Astronauts'; На выходе должны получить многомерный ассоциативный массив вида Code: Top / | \ Science Hobbies Collections / | \ Astronomy Amateurs_Astronomy Pictures / \ | Astrophysics Cosmology Astronomy / | \ Galaxies Stars Astronauts
Грязный хак PHP: $result = [];foreach($array as $a) eval('$result["'.str_replace('.','"]["',$a).'"]=[];');print_r($result); Code: Array ( [Top] => Array ( [Science] => Array ( [Astronomy] => Array ( [Astrophysics] => Array ( ) [Cosmology] => Array ( ) ) ) [Hobbies] => Array ( [Amateurs_Astronomy] => Array ( ) ) [Collections] => Array ( [Pictures] => Array ( [Astronomy] => Array ( [Stars] => Array ( ) [Galaxies] => Array ( ) [Astronauts] => Array ( ) ) ) ) ) )
Вариант без подлого eval : PHP: function process(&$el, $nodes) { $node = array_shift($nodes); if (empty($node)) return; if (!isset($el[$node])) $el[$node] = array(); process($el[$node], $nodes);}$tree = array();foreach ($array as $nodes) { process($tree, explode('.', $nodes));}echo '<pre>';print_r($tree);
OMG, хотя зачем эта подлая рекурсия (теоретически, рекурсия может вызвать переполнение стека , если ветка дерева очень длинная) PHP: $tree = array();foreach ($array as $nodes) { $el = &$tree; foreach (explode('.', $nodes) as $node) { isset($el[$node]) or $el[$node] = array(); $el = &$el[$node]; }}echo '<pre>';print_r($tree);