У меня есть следующий массив:
Array ( [0] => INBOX.Trash [1] => INBOX.Sent [2] => INBOX.Drafts [3] => INBOX.Test.sub folder [4] => INBOX.Test.sub folder.test 2 )
Как преобразовать этот массив в многомерный массив следующим образом:
Array ( [Inbox] => Array ( [Trash] => Array ( ) [Sent] => Array ( ) [Drafts] => Array ( ) [Test] => Array ( [sub folder] => Array ( [test 2] => Array ( ) ) ) ) )
Попробуй это.
<?php $test = Array ( 0 => 'INBOX.Trash', 1 => 'INBOX.Sent', 2 => 'INBOX.Drafts', 3 => 'INBOX.Test.sub folder', 4 => 'INBOX.Test.sub folder.test 2', ); $output = array(); foreach($test as $element){ assignArrayByPath($output, $element); } //print_r($output); debug($output); function assignArrayByPath(&$arr, $path) { $keys = explode('.', $path); while ($key = array_shift($keys)) { $arr = &$arr[$key]; } } function debug($arr){ echo "<pre>"; print_r($arr); echo "</pre>"; }
Меня это очень интересовало, поскольку я прилагал огромные усилия, пытаясь это сделать. Рассмотрев (и пройдя) решение Джона, я придумал следующее:
$array = array(); function parse_folder(&$array, $folder) { // split the folder name by . into an array $path = explode('.', $folder); // set the pointer to the root of the array $root = &$array; // loop through the path parts until all parts have been removed (via array_shift below) while (count($path) > 1) { // extract and remove the first part of the path $branch = array_shift($path); // if the current path hasn't been created yet.. if (!isset($root[$branch])) { // create it $root[$branch] = array(); } // set the root to the current part of the path so we can append the next part directly $root = &$root[$branch]; } // set the value of the path to an empty array as per OP request $root[$path[0]] = array(); } foreach ($folders as $folder) { // loop through each folder and send it to the parse_folder() function parse_folder($array, $folder); } print_r($array);