搞定了!很棒的挑战!
首先,我按文件夹数量对数组进行排序,以便首先处理具有最少文件夹(在根目录中)的项目。
然后,函数遍历每个数组项和该项中的每个文件夹,将其与数组中现有的项目进行比较,如果存在,则将其作为多维数组放置在该项中。
这适用于最多两个子文件夹 - /root/sub1/sub2 - 但是添加更深层次的功能也很简单。
此示例代码还打印出了处理前/处理后的数组:
$singleArray = array(
'/Web',
'/Web/Test1',
'/Web/Test2',
'/Web/Test2/Subfolder',
'/Web/Test3',
'/Public'
);
echo "<pre>";
print_r($singleArray);
$multiArray = array();
usort($singleArray, function($a, $b) {
$a_folders = explode("/", $a);
$b_folders = explode("/", $b);
$a_num = count($a_folders);
$b_num = count($b_folders);
if($a_num > $b_num) return -1;
elseif($a_num < $b_num) return 1;
else return 0;
});
foreach($singleArray as $item){
$folders = explode("/", $item);
if(in_array($folders[0], $multiArray)){
$key1 = array_search($folders[0], $multiArray);
if(in_array($folders[1], $multiArray[$key1])){
$key2 = array_search($folders[1], $multiArray[$key1]);
if(in_array($folders[2], $multiArray[$key1][$key2])){
$key3 = array_search($folders[2], $multiArray[$key1][$key2]);
array_push($multiArray[$key1][$key2][$key3], $item);
} else array_push($multiArray[$key1][$key2], $item);
} else array_push($multiArray[$key1], $item);
} else array_push($multiArray, $item);
}
$multiArray = array_reverse($multiArray);
print_r($multiArray);
这将输出:
Array
(
[0] => /Web
[1] => /Web/Test1
[2] => /Web/Test2
[3] => /Web/Test2/Subfolder
[4] => /Web/Test3
[5] => /Public
)
Array
(
[0] => /Web
[1] => /Public
[2] => /Web/Test1
[3] => /Web/Test2
[4] => /Web/Test3
[5] => /Web/Test2/Subfolder
)