如何将多个小数组转换为单个多维数组。
我有一个主要的大数组,其中包含这样的小数组。
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'];
}
}
上面的代码适用于一级深度数组,但不适用于多级深度数组。
我该如何解决这个问题?
答案 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'];
}