Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niestandardowe sortowanie
Forum PHP.pl > Forum > PHP
kornel-php
Witam! Otóż mój problem wygląda tak:

Mam katalog, w którym są inne katalogi z plikami, wygląda to tak:

katalog 'a' zawiera pliki: a.pdf, g.pdf i j.pdf
katalog 'b' zawiera pliki: c.pdf, u.pdf, z.pdf
katalog 'c' zawiera pliki: b.pdf, d.pdf, e.pdf

Teraz wrzucam wszystko do tablicy i sortuje funkcją sort, to otrzymuję:

Kod
a/a.pdf
a/g.pdf
a/j.pdf
b/c.pdf
b/u.pdf
b/z.pdf
c/b.pdf
c/d.pdf
c/e.pdf


A chciałbym otrzymać to posortowane w następujący sposób:

Kod
a/a.pdf
c/b.pdf
b/c.pdf
c/d.pdf
c/e.pdf
...


Jest taka możliwość, jeśli tak to prosiłbym o pomoc, z góry dziękuję!
franki01
Te nazwy plikow w roznych katalogach moga sie powtarzac?
kornel-php
Aktualnie się nie powtarzają i raczej nie powinny
em1X
1) więc pobierz do tablicy nazwy katalogów - posortuj ją
2) dla każdego folderu teraz posortuj pliki
3) połącz tablice
kornel-php
Kod
1) więc pobierz do tablicy nazwy katalogów - posortuj ją
2) dla każdego folderu teraz posortuj pliki
3) połącz tablice


Tzn? Odpalam katalog główny, wyszukuje w nim folderów (jakaś pętelka), później z każdego folderu tworzę posortowaną tablice plików?

Jest to jakieś rozwiązanie... Najlepsza dla mnie byłaby funkcja sortująca elementy tablicy biorąc pod uwagę załóżmy ostatnie 5 znaków z elementu... Niestety nie mogę nic takiego namierzyć, więc chyba pokusze się o Twoje rozwiązanie...
starach
Jako tako działa.
  1. <?php
  2. function porownaj($a, $b)
  3. {
  4. $a = explode('/', $a);
  5. $b = explode('/', $b);
  6. return strcmp(max($a), max($b));
  7. }
  8. $arr = array();
  9. $arr[] = 'a/a.pdf';
  10. $arr[] = 'a/g.pdf';
  11. $arr[] = 'a/j.pdf';
  12. $arr[] = 'b/c.pdf';
  13. $arr[] = 'b/u.pdf';
  14. $arr[] = 'b/z.pdf';
  15. $arr[] = 'c/b.pdf';
  16. $arr[] = 'c/d.pdf';
  17. $arr[] = 'c/e.pdf';
  18.  
  19. usort($arr, 'porownaj');
  20. var_dump($arr);
  21. ?>
edit>
Wynik:
Kod
array
  0 => string 'a/a.pdf' (length=7)
  1 => string 'c/b.pdf' (length=7)
  2 => string 'b/c.pdf' (length=7)
  3 => string 'c/d.pdf' (length=7)
  4 => string 'c/e.pdf' (length=7)
  5 => string 'a/g.pdf' (length=7)
  6 => string 'a/j.pdf' (length=7)
  7 => string 'b/u.pdf' (length=7)
  8 => string 'b/z.pdf' (length=7)
franki01
Na poczatek w $allFiles jest ta lista plikow

  1. <?php
  2. $filesDir = array();
  3.  
  4. foreach($allFiles as $file) {
  5. $ex = explode("/", $file);
  6. $filesDir[$ex[0]] = $ex[1];
  7. }
  8.  
  9. asort($filesDir);
  10.  
  11. $allFiles = array();
  12.  
  13. foreach($filesDir as $dir => $file) {
  14. $allFiles[] = $dir."/".$file;
  15. }
  16. ?>


Na zakonczenie w $allFiles masz posegregowana liste wg nazwy plikow..
kornel-php
  1. <?php
  2. function porownaj($a, $b)
  3. {
  4. $a = explode('/', $a);
  5. $b = explode('/', $b);
  6. return strcmp(max($a), max($b));
  7. }
  8. $arr = array();
  9. $arr[] = 'a/a.pdf';
  10. $arr[] = 'a/g.pdf';
  11. $arr[] = 'a/j.pdf';
  12. $arr[] = 'b/c.pdf';
  13. $arr[] = 'b/u.pdf';
  14. $arr[] = 'b/z.pdf';
  15. $arr[] = 'c/b.pdf';
  16. $arr[] = 'c/d.pdf';
  17. $arr[] = 'c/e.pdf';
  18.  
  19. usort($arr, 'porownaj');
  20. ?>



A jak wyglądałby ten kod dla plików o ścieżce 'katalog1/kat2/kat3/kat4/kat.../nazwa.pliku'?

Teraz narodził mi się taki własnie problem... :/
qqrq
Cytat(kornel-php @ 17.09.2007, 22:10:29 ) *
A jak wyglądałby ten kod dla plików o ścieżce 'katalog1/kat2/kat3/kat4/kat.../nazwa.pliku'?


Duuużo bardziej skomplikowanie... winksmiley.jpg A poważnie - wymyślenie takiej funkcji dla dowolnej ilości slashy to dość... zajmujący problem (chyba, że sortujesz zawsze po nazwie pliku i olewasz katalogi - wtedy prościej.
kornel-php
Zdecydowanie olewam katalogi, mnie interesuje tylko nazwa pliku. Jakieś pomysły?
qqrq
Jeśli olewasz katalogi, to można to zrobić "a 'la kornel-php":

  1. <?php
  2. function porownaj($a, $b) { return strcmp(substr($a,strrpos($a,'/')+1), substr($b,strrpos($b,'/')+1)); }
  3. $arr = array();
  4. $arr[] = 'a/a.pdf';
  5. $arr[] = 'a/g.pdf';
  6. $arr[] = 'a/j.pdf';
  7. $arr[] = 'b/c.pdf';
  8. $arr[] = 'b/u.pdf';
  9. $arr[] = 'b/z.pdf';
  10. $arr[] = 'c/b.pdf';
  11. $arr[] = 'c/d.pdf';
  12. $arr[] = 'c/e.pdf';
  13.  
  14. usort($arr, 'porownaj');
  15. ?>


Powinno działać...
kornel-php
Wielkie dzięki! Działa idealnie, jak chciałem!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.