我在这里有一个棘手的问题:那里有一个像
这样的形式的多维数组Array
(
[0] => Array
(
[path] => /folder/subfolder1/
[filename] => file1
)
[1] => Array
(
[path] => /folder/
[filename] => file2
)
[2] => Array
(
[path] => /folder/subfolder2/
[filename] => file3
)
)
现在我想重新排列它,以便映射给定的文件夹结构。例如。在这种情况下有
Array
(
['folder'] => Array
(
[0] => Array
(
[path] => /folder/
[filename] => file2
)
['subfolder1'] => Array
(
[0] => Array
(
[path] => /folder/subfolder1
[filename] => file1
)
)
['subfolder2'] => Array
(
[0] => Array
(
[path] => /folder/subfolder2
[filename] => file3
)
)
)
)
有一种简单的方法吗?我已经尝试过使用array_map()而我已经尝试将[]组合在一个foreach {}中,但我完全被困在这里。而且我已经对这件事情进行了长时间的讨论,以至于我害怕我再也看不到树木了。
答案 0 :(得分:2)
这应该可以满足您的需求:
如果您需要一些解释,请告诉我。我觉得递归足够解释。当然你可以在某些时候使用一些PHP内置函数来解析你的数组,但是当你必须处理复杂的结构和递归时,你可以通过一些常规的foreach,imo来更清楚地做到这一点。
$array[0]['path'] = '/folder/';
$array[0]['filename'] = 'file1';
$array[1]['path'] = '/folder/sub1';
$array[1]['filename'] = 'file2';
$array[2]['path'] = '/folder/sub2';
$array[2]['filename'] = 'file3';
$array[3]['path'] = '/folder/sub2/sub3';
$array[3]['filename'] = 'file4';
$array[4]['path'] = '/folder/sub2/sub3';
$array[4]['filename'] = 'file5';
$array[5]['path'] = '/folder/';
$array[5]['filename'] = 'file6';
function add_element_to_folder (&$new_array, $path, $filename) {
$folder = array_shift($path);
if (empty($path)) {
$new_array[$folder][] = $filename;
} else {
add_element_to_folder ($new_array[$folder], $path, $filename);
}
}
$new_array = array();
foreach ($array as $value) {
$path = array_filter(explode('/', $value['path']));
add_element_to_folder($new_array, $path, $value['filename']);
}
var_dump($new_array);
输出:
Array
(
[folder] => Array
(
[0] => file1
[sub1] => Array
(
[0] => file2
)
[sub2] => Array
(
[0] => file3
[sub3] => Array
(
[0] => file4
[1] => file5
)
)
[1] => file6
)
)