我有以下数组:
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
(
)
)
)
)
)
答案 0 :(得分:4)
试试这个。
<?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>";
}
答案 1 :(得分:0)
我对此感兴趣,因为尝试这样做非常困难。在查看(并通过)Jon的解决方案之后,我想出了这个:
$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);