Masz to działa! Wielkie wyzwanie!
Najpierw sortuję tablicę według liczby folderów, tak aby pierwsze przetwarzane były z najmniejszą liczbą folderów (w katalogu głównym).
Następnie funkcja przechodzi przez każdy z elementów tablicy i każdego folderu w tym elemencie, porównując go z istniejącymi elementami w tablicy i, jeśli istnieje, umieszczając go wewnątrz tego elementu jako tablicę wielowymiarową.
Będzie to działać dla maksymalnie dwóch podfolderów -/root/sub1/sub2 - ale jest całkiem proste, aby dodać funkcjonalność do głębszego użytku.
Ten przykładowy kod drukuje również, przed/po tablicach:
$singleArray = array(
'/Web',
'/Web/Test1',
'/Web/Test2',
'/Web/Test2/Subfolder',
'/Web/Test3',
'/Public'
);
echo "<pre>";
print_r($singleArray);
$multiArray = array();
//first sort array by how many folders there are so that root folders are processed first
usort($singleArray, function($a, $b) {
$a_folders = explode("/", $a);
$b_folders = explode("/", $b);
$a_num = count($a_folders); //number of folders in first
$b_num = count($b_folders); //number of folders in second
if($a_num > $b_num) return -1;
elseif($a_num < $b_num) return 1;
else return 0;
});
//foreach in array
foreach($singleArray as $item){
//get names of folders
$folders = explode("/", $item);
//if the first folder exists
if(in_array($folders[0], $multiArray)){
$key1 = array_search($folders[0], $multiArray);
//repeat for subfolder #1
if(in_array($folders[1], $multiArray[$key1])){
$key2 = array_search($folders[1], $multiArray[$key1]);
//repeat for subfolder #2
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);
}
//reverse the array so that it looks nice
$multiArray = array_reverse($multiArray);
print_r($multiArray);
Wyjście to będzie:
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
)
nie umieścić głos, ale jest to pytanie z prośbą o kroków logicznych zaangażowany? A może po prostu prośba o napisanie kodu dla OP? – SnoApps
Dobra odpowiedź da logikę i prawdopodobnie zrobi to za pomocą kodu (ponieważ ładniej jest patrzeć niż pseudokodu lub schematów blokowych) – jcuenod
Nie wiem, na co ludzie narzekają. To jest uzasadnione pytanie. Odpowiedź może być w pseudokodzie, który znasz. – Andrew