Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: alfabetyczna lista plikow + tablice = problem?!
Forum PHP.pl > Forum > Przedszkole
patigo
Ma ktoś może pomysł jak wykonać listę alfabetycznie ułożoną?
1. wczytuje do tablicy nazwy plików ( od a do z - mnóstwo)
i teraz chciałbym utworzyć drugą tablicę z samymi literami od a do z następnie chciałbym wyświetlić listę tych plików ale w taki sposób aby pliki były pogrupowane alfabetycznie dla każdej litery z drugiej tablicy np:

Lista plików na A:
ala.txt
alina.txt

Lista plików na B:
basia.txt
bożena.txt

itd...
brachu
  1. SELECT *
  2. FROM tabela WHERE kolumna LIKE 'a%';


itd.

pozdro
patigo
Bez użycia bazy danych a pozatym to zapytanie nie pogrupuje mi alfabetycznie wpisów zaczynających się na kolejne litery alfabetu
crash
  1. <?php
  2. $pliki = array( 'a.txt', 'ab.txt', 'c.cos', 'plik.txt', 'aa.txt', 'basia.txt', 'bozena.txt', 'heniek.txt', 'zeta.txt', 'ziula.txt' );
  3. natsort( $pliki );
  4.  
  5. $wynik = array();
  6.  
  7. foreach( $pliki as $plik )
  8. {
  9.  $lit = substr( $plik, 0, 1 );
  10.  
  11.  if( $lit != $oldList )
  12.  {
  13. $wynik[ $lit ][] = $plik;
  14.  }
  15.  
  16.  $oldLit = $lit;
  17. }
  18. print_r( $wynik );
  19. ?>
patigo
spoko no niby działa ale postać wynikowa jest taka troche dziwna...
Array ( [a] => Array ( [0] => a.txt [1] => aa.txt [2] => ab.txt ) [b] => Array ( [0] => basia.txt [1] => bozena.txt ) [c] => Array ( [0] => c.cos ) [h] => Array ( [0] => heniek.txt ) [p] => Array ( [0] => plik.txt ) [z] => Array ( [0] => zeta.txt [1] => ziula.txt ) )

A jak mam tablicę dwu wymiarową gdzie powiedzmy kolumny to litery a wiersze to pliki:

A | B | ... | Z
ala,
aka

to w jaki sposób mogę wyświetlić np wszystkie wiersze dla kolumny A i B questionmark.gif
mike
A co Ty myślisz, że za Ciebie wszystko tu ktoś odwali.
~crash podał Ci metodę, która przedstawia dane w bardzo przejrzystej tablicy.

A jak nie wiesz co z tym zrobić to odsyłam to kursu dla początkujących i poczytaj o ... pętli.
LBO
  1. <?php
  2.  
  3. /**
  4.    * funkcja zwraca tablice dla danej litery
  5.    * alfabetu $let z - uprzednio stworzonej
  6.    * przez procedure crash'a - tablicy $array
  7.    *
  8.    * @param string $let
  9.    * @param array $array
  10.    * @return mixed
  11.    */
  12. function show($let, $array) {
  13. if (array_key_exists($let, $array)) {
  14. return $array[$let];
  15. } else {
  16. return false;
  17. }
  18. }
  19.  
  20. print_r(show('A', $array));
  21.  
  22. ?>


wyswietlenie tego to juz szczegol biggrin.gif

pozdro!!!
patigo
Teraz to się kompletnie pogubilem... nie otrzymuje żadnego wyniku. nie wiem czy ta funkcja działa.
UDAT
Cytat(patigo @ 2006-01-06 11:37:53)
Teraz to się kompletnie pogubilem... nie otrzymuje żadnego wyniku. nie wiem czy ta funkcja działa.

Czy ty to tylko bezmyślnie przeklepałeś questionmark.gif?

W kodzie LBO trzeba zamienić
  1. <?php
  2.  
  3.  print_r(show('A', $array));
  4.  
  5. ?>


na

  1. <?php
  2.  
  3.  print_r(show('A', $wynik));
  4.  
  5. ?>


aarambo.gif
patigo
Zrobiłem jak piszesz i nic. modyfikowałem kod ale nic to nie dało. Ale już nie ważne, wymyśliłem coś innego wkrotce prześle swój kod.
LBO
heeh, moj blad. procedura crasha daje male litery jako kluczea ja w podanym przykladzie wklepalem duze.. i wtedy:
  1. <?php
  2.  
  3. print_r(show('A', $wynik)); //false
  4. print_r(show('a', $wynik)); //array
  5.  
  6. ?>

trzeba tylko dodac:
  1. <?php
  2. function show($let, $array) {
  3. $let = strtolower($let);
  4. //reszta kodu
  5. }
  6. ?>

i po klopocie... crash tez mogl sie o to zatroszczyc i zrobic:
  1. <?php
  2.  
  3. $pliki = array( 'a.txt', 'ab.txt', 'c.cos', 'plik.txt', 'aa.txt', 'basia.txt', 'bozena.txt', 'heniek.txt', 'zeta.txt', 'ziula.txt' );
  4. natsort( $pliki );
  5.  
  6. $wynik = array();
  7.  
  8. foreach( $pliki as $plik )
  9. {
  10.  //tu zmienilem
  11.  $lit = strtolower(substr( $plik, 0, 1 ));
  12.  
  13.  if( $lit != $oldList )
  14.  {
  15. $wynik[ $lit ][] = $plik;
  16.  }
  17.  
  18.  $oldLit = $lit;
  19. }
  20.  
  21. ?>

wczesniej mogly powstac dwa "takie same" klucze, roznily by sie wielkoscia litery. co nie jest zbyt ekonomiczne i optymalne... a tego nie chcemy - chyba tongue.gif
crash
A czemu tam dałeś strtolower()? Nikt nie wspominał o tym, że pliki mogą zaczynać się tylko z małej literki. Na tamten czas napisałem w miarę optymalny i uniwersalny algorytm.
LBO
bo casesensitive dzialanie na plikach jest bezsensowne... na winie nie ma rozroznienia miedze 'Plik.txt', a 'plik.txt' - to to samo.. chociaz z drugiej strony nie wiem jak na linuxie... :/, ale pewnie ty mnie oswiecisz.. zreszta: zobaczymy, jakie rozwiazanie przypasuje ~patigo. wie przynajmniej dlaczego nie dzialalo mu wczesniej nasze rozwiazanie biggrin.gif heheh
patigo
Trochę siedziałem nad różnymi optymalnymi rozwiązaniami i doszedłem do czegoś takiego:
  1. <?php
  2.  
  3. function katalogi($dir_name,$letter){ 
  4. echo '<div style="width:500px; height:auto;">';
  5. if (is_dir($dir_name) && is_readable($dir_name)) {
  6.         $d = dir($dir_name);
  7.         while (false !== ($f = $d->read())) {
  8.             // pomijamy . i .. 
  9.             if (('.' == $f) || ('..' == $f)) {
  10.                 continue;
  11.             }
  12.             if (is_dir("$dir_name/$f")) {
  13.                 $pliki=array($f);
  14.                 sort ($pliki);
  15.                 foreach( $pliki as $plik ){
  16.                     $litera = substr( $plik, 0, 1 );
  17.                     if($litera==$letter){
  18.                         //tu wyświetlam stosowną listę w takiej formie jak mi potrzeba....echo $plik;
  19.                     }
  20.                 }
  21.             }        
  22.          }   
  23.     }echo '</div>';
  24. }
  25. ?>


dla plików

  1. <?php
  2.  
  3. function artysta($dir_name,$wykonawca){
  4.   echo '<div style="width:500px; height:auto;">';
  5.   if (is_dir($dir_name) && is_readable($dir_name)) {
  6.         $d = dir($dir_name);
  7.         while (false !== ($f = $d->read())) {
  8.             // pomijamy . i .. 
  9.             if (('.' == $f) || ('..' == $f)) {
  10.                 continue;
  11.             }
  12.             if (is_file("$dir_name/$f")) {
  13.                 $pliki=array($f);
  14.                 sort($pliki);
  15.                 echo $f;
  16.                 
  17.             }             
  18.             
  19.             
  20.         }   
  21.         
  22.     } echo '</div>';
  23. }
  24. ?>


Może efekt końcowy nie jest do końca taki o jakim myslałem na początku, ale spełnia dość dobrze zadanie które sobie wyznaczyłem.

P.S. Mam jeszcze tylko małe pytanie:
wprowadzając dane do tablicy:
Cytat
if (is_dir("$dir_name/$f")) {
                $pliki=array($f);
                sort ($pliki);
}

pobiera mi nazwy katalogów a funkcja sort sortuje wg daty utworzenia/modyfikacji, czy można jakos wymusić lub zmienić funkcję sortującą aby układała wg alfabetu??
crash
Najpierw to proponuję się przyjżeć temu fragmentowi kodu, przecież to nie robi nic poza tworzeniem cały czas 1-elementowej tablicy i sortowaniu jej. A i funkcja sort() posortuje tu po wartościach z tablicy, pod warunkiem, że dobrze jej użyjesz.
patigo
Już miałem napisać że nie wiem o co chodzi ale nie zwróciłem uwagi na prosty błąd, innymi słowy zapętliłem sie w myślach smile.gif,


i zamiast:
Cytat
if (is_dir("$dir_name/$f")) {
                $pliki=array($f);
                sort ($pliki);
}


napisałem
  1. <?php
  2.  
  3. if (is_dir("$dir_name/$f")) {
  4.  $pliki[]=$f;
  5. }
  6. ?>


a sortowanie i wyświetlanie wrzuciłem poza while....
i dizala jak należy.

Dziękuje.
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.