4

次の配列があります。

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
                                (
                                )

                        )

                )

        )

)
4

2 に答える 2

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>";
}
于 2013-02-28T10:37:41.447 に答える
0

これをやろうとするのは非常に困難だったので、私はこれに非常に興味がありました。ジョンのソリューションを見て(そして調べて)、私はこれを思いつきました:

$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);
于 2013-02-28T10:52:12.193 に答える