Od razu mówię, że zdaje sobie sprawę z tego że PHP nie jest językiem programowania przeznaczonym do tego typu rzeczy. Jednak z racji tego że go w miarę umiem muszę napisać na szybko w nim skrypt. Otóż zawartość katalogu o nazwie np. “kat” to foldery i pliki tekstowe. I teraz jeżeli plik zawiera nazwę jakiegoś z folderów to przenieś plik do tego folderu. Np. jeśli katalog nazywa się D4717-01D1RAD a są pliki o nazwie D4717-01D1RAD MIRROR.txt, D4717-01D1RAD SFSD.txt to żeby przeniósł je do tego katalogu(D4717-01D1RAD).
Ja bym sugerował utworzyć sobie dwie tablice: na foldery oraz pliki. I w tej pętli, coś ją napisał, dla każdego $entry rozpoznawać czy jest to plik czy katalog (funkcją is_dir(): http://www.php.net/manual/en/function.is-dir.php) i wstawiać do właściwej tablicy.
Potem należy przeglądnąć tablicę z plikami (w pętli) i dla każdego elementu wyszukiwać, czy nie zawiera on w sobie nazwy jakiegoś folderu (zakładam, że nazwy folderów nie zawierają się w sobie, tj. nie będzie DIRECT1122 oraz DIRECT11). Do wyszukiwania tego występowania proponuję napisać osobną funkcję (będzie wygodniej się nią w pętli posłużyć).
I ważne jest, czy pliki mają zawierać nazwę katalogu w dowolnym miejscu, czy patrząc od początku tej nazwy?
function f($a){
foreach($kat as $k){//lepsza opcja przejścia przez tablice
if(strstr($a,$k)!='FALSE') $t=$k)//jeśli znajdziemy katalog zapisujemy go w zmiennej
}
if(!empty($r)) copy($a,$t.'\'.$p);//interesuje nas ostatni katalog, jeśli coś znaleźliśmy to kopiujemy
}
foreach ($pl as $p) {
f($p);//wywołujemy funkcje wg plików
}
Co do twojego przykładu, teoretycznie jest ok, ale nie spełnia wymagań dot. zadania. Tzn nie kopiuje plików, oraz wyświetla wszystko tzn v, v2, dla pliku zawierającego v2. Tak samo weź pod uwagę, że :
Lepiej zrobić podczas listowania (mniej razy sprawdzasz). Oraz zamiast i=0;while(sth){… i++;} lepiej sobie zrobić for Nie musisz przekazywać tablic do funkcji.
a rozmiar tablicy (liczbę jej elementów) - jeśli jest konieczna - policzyć na końcu
$x = count($katalogi);
Jeśli nazwy folderów zawierają się częściowo w sobie (np. mamy takie: DIRECT1122, DIRECT112233 oraz DIRECT11), to co zrobić z plikiem DIRECT1122334455.txt? W zaprezentowanym przypadku trafi on albo do pierwszego (DIRECT1122), albo do ostatniego (DIRECT11) folderu - w obu przypadkach chyba błędnie, bo chcielibyśmy by trafił do “najdłużej dopasowanego”. Wtedy należy skorzystać z wyrażenia regularnego i funkcji preg_match(), wyznaczać długość dopasowania i zapamiętywać maksimum (długość oraz wartość).
Dobrze byłoby też uwzględnić wielkość liter w nazwach plików (w Windows nie ma ich rozróżniania, w Linuksie jest) i uwzględnić to (użyć funkcji stristr() lub w regexp modyfikatora “i” w przypadku nie rozróżniania wielkości liter).
A ta funkcja nie zwraca przypadkiem folderów posortowanych ? DIRECT11 DIRECT1122, DIRECT112233 ? Takie jest moje założenie, może jest błędne Od biedy można posortować tablicę
No ale DIRECT112233 jest w tym wypadku ostatni (po sortowaniu oczywiście).
co do readdir, rzeczywiście sprawdziłem. Zwraca po swojemu (data utworzenia, ani nazwa to nie są ;/ Bowiem pomiędzy nimi mam pliki z mojego serwera utworzone wcześniej