如何将多个数组转换为单个多维数组

时间:2014-07-26 06:08:12

标签: php arrays

如何将多个小数组转换为单个多维数组。

我有一个主要的大数组,其中包含这样的小数组。

Array
(
[0] => Array
    (
    [length] => 1073709056
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_02_3.VOB
        )

    )

[1] => Array
    (
    [length] => 1073709056
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_02_1.VOB
        )

    )

[2] => Array
    (
    [length] => 1073709056
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_02_4.VOB
        )

    )

[3] => Array
    (
    [length] => 1073709056
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_02_2.VOB
        )

    )

[4] => Array
    (
    [length] => 295792640
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_02_5.VOB
        )

    )

[5] => Array
    (
    [length] => 39620608
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_01_1.VOB
        )

    )

[6] => Array
    (
    [length] => 274893
    [path] => Array
        (
            [0] => Cover & Label
            [1] => This Is 40 (2012) label.jpg
        )

    )

[7] => Array
    (
    [length] => 197602
    [path] => Array
        (
            [0] => Cover & Label
            [1] => This Is 40 (2012) cover.jpg
        )

    )

[8] => Array
    (
    [length] => 88064
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_02_0.BUP
        )

    )

[9] => Array
    (
    [length] => 88064
    [path] => Array
        (
            [0] => VIDEO TS
            [1] => VTS_02_0.IFO
        )

    )

[10] => Array
    (
    [length] => 64109
    [path] => Array
        (
            [0] => INFO TBS
            [1] => silver torrent logo.jpg
        )

    )
)

[length]是文件大小。

[path]是文件路径。

如果[path]中的元素大于1,则除了last之外的所有元素都是父目录顺序,而last element是文件名。 像这样

 Array
        (
        [length] => 64109
        [path] => Array
            (
                [0] => directory
                [1] => sub-directory
                [2] => silver torrent logo.jpg
            )

        )

如何将上面的数组转换为以下数组。

Array
(
    [directory1] Array(
                        [file1.jpg] => 197602
                        [file2.jpg] => 274893
                        )

    [directory2]Array(
                        [file1.txt] => 41
                        [file2.txt] => 41
                        [sub-directory1]Array(
                                                [file1.txt] => 41
                                                [file2.txt] => 44
                                                [file3.txt] => 54
                                                )

                    )
    [file1.txt] => 41
    [file2.txt] => 47
)
到目前为止,我已经这样做了

    foreach($old_files as $x)
    {

        if (isset($x['path'][1])){
    //$path=$x['path'][0];
    $path = @iconv('utf-8', 'utf-8//ignore', $x['path'][0]);
    $path1 = @iconv('utf-8', 'utf-8//ignore', $x['path'][1]);
    $files[$path][$path1] = $x['length']; 

        }else{
    $path = @iconv('utf-8', 'utf-8//ignore', $x['path'][0]);
    $files[$path] =  $x['length'];
        }
    }

上面的代码适用于一级深度数组,但不适用于多级深度数组。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我们可以使用变量来跟踪我们正在处理的内部数组:

$output = array();
foreach ($arr as $v) {
    $pointer = &$output;
    $path = $v['path'];
    for ($i = 0; $i < count($path)-1; $i++) {
        $dir = $path[$i];
        if (!array_key_exists($dir, $pointer)) {
            $pointer[$dir] = array();
        }

        $pointer = &$pointer[$dir];
    }

    $file = $path[count($path)-1];
    $pointer[$file] = $v['length'];
}