【问题标题】:How to convert multiple arrays into single multi-dimentional array如何将多个数组转换为单个多维数组
【发布时间】:2014-07-26 06:08:11
【问题描述】:

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

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

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,则除最后一个元素之外的所有元素都是父目录顺序,而最后一个元素是文件名。 像这样

 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'];
        }
    }

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

我该如何解决这个问题?

【问题讨论】:

  • 目录中的文件怎么办?这可能吗?那么目录 asd 和目录 asd/asd/asd/asd/asd.jpg 呢?如何区分它们?
  • 是的,目录中也有目录。我们可以使用数组元素的数量来区分它们,最后一个元素是文件名。
  • 是否有可能某些目录具有相同的名称?如果是这样,我们就无法知道哪个是父目录。
  • 是的,可以,但是每个数组都包含目录顺序,请检查更新的问题。
  • 哎呀,错过了那部分,感谢您指出这一点

标签: php arrays


【解决方案1】:

我们可以使用一个变量来跟踪我们正在处理的内部数组,如下所示:

$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'];
}

【讨论】:

  • 完美,非常感谢。我使用 if 条件来检查 foreach 循环内的计数,但你的更合适。
猜你喜欢
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2015-07-31
  • 2014-09-09
相关资源
最近更新 更多