Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> alfabetyczna lista plikow + tablice = problem?!
patigo
post 5.01.2006, 15:28:21
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
brachu
post 5.01.2006, 15:47:47
Post #2





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 13.04.2005

Ostrzeżenie: (0%)
-----


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


itd.

pozdro


--------------------
www.tanieprogramy.edu.pl
www.zamkor.pl
Go to the top of the page
+Quote Post
patigo
post 5.01.2006, 15:50:41
Post #3





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

Ostrzeżenie: (0%)
-----


Bez użycia bazy danych a pozatym to zapytanie nie pogrupuje mi alfabetycznie wpisów zaczynających się na kolejne litery alfabetu
Go to the top of the page
+Quote Post
crash
post 5.01.2006, 16:02:00
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

Ostrzeżenie: (0%)
-----


  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. ?>


--------------------
Go to the top of the page
+Quote Post
patigo
post 5.01.2006, 17:03:23
Post #5





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mike
post 5.01.2006, 17:34:14
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
LBO
post 5.01.2006, 17:53:55
Post #7





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  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!!!

Ten post edytował LBO 5.01.2006, 19:11:45
Go to the top of the page
+Quote Post
patigo
post 6.01.2006, 12:37:53
Post #8





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

Ostrzeżenie: (0%)
-----


Teraz to się kompletnie pogubilem... nie otrzymuje żadnego wyniku. nie wiem czy ta funkcja działa.
Go to the top of the page
+Quote Post
UDAT
post 6.01.2006, 17:46:12
Post #9





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
patigo
post 6.01.2006, 21:03:11
Post #10





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
LBO
post 7.01.2006, 14:34:52
Post #11





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował LBO 7.01.2006, 14:47:12
Go to the top of the page
+Quote Post
crash
post 7.01.2006, 15:06:04
Post #12





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
LBO
post 7.01.2006, 15:10:29
Post #13





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował LBO 7.01.2006, 15:20:21
Go to the top of the page
+Quote Post
patigo
post 10.01.2006, 02:42:10
Post #14





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

Ostrzeżenie: (0%)
-----


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??

Ten post edytował patigo 10.01.2006, 02:45:55
Go to the top of the page
+Quote Post
crash
post 10.01.2006, 12:39:12
Post #15





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
patigo
post 17.01.2006, 15:45:13
Post #16





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 08:37