Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie tabilcy.
Forum PHP.pl > Forum > Przedszkole
Upachi
Witam! Szukałem już czegoś podobnego na forum, ale nic nie udało mi się znaleźć.

Na początku chcę zaznaczyć, że dopiero niedawno zacząłem zabawę z php więc proszę o wyrozumiałość. smile.gif

Otóż napisałem sobie taki skrypt, który zlicza ilości odwiedzin poszczególnych podstron. Działa to tak, że jest plik, w którym są zapisywane dane dotyczące podstrony i ilości odwiedzin. I za każdym razem jak ktoś wejdzie na podstrone, skrypt wczytuje zawartość pliku sprawdza czy dana podstrona już jest, i jeśli tak to zwiększa ilość wizyt o 1. Dane dotyczące podstron są zapisywane w takiej formie:

strona004.php:1
strona002.php:5
strona001.php:10
strona003.php:13
strona006.php:7

I teraz mam pytanie, w jaki sposób posortować te dane wg tych cyferek po ":". Wydaje mi się, że należałoby użyć usort() lub uksort() jednak nie wiem, w jaki sposób. Z góry dziękuje za pomoc smile.gif

P.S Niechciałbym tego robić przy pomocy bazy danych, gdyż nie posiadam takiego serwera smile.gif
crash
  1. <?php
  2. $t = array();
  3.  
  4. $t[] = 'strona004.php:1';
  5. $t[] = 'strona002.php:5';
  6. $t[] = 'strona001.php:10';
  7. $t[] = 'strona003.php:13';
  8. $t[] = 'strona006.php:7';
  9.  
  10. function sortuj( $x, $y )
  11. {
  12.  $x = substr( strstr( $x, ':' ), 1 );
  13.  $y = substr( strstr( $y, ':' ), 1 );
  14.  
  15.  if( $x == $y )
  16.  {
  17. return 0;
  18.  }
  19.  return ( $x < $y ) ? -: 1;
  20. } 
  21.  
  22. usort( &$t, 'sortuj' );
  23.  
  24. print_r( $t );
  25. ?>
kszychu
  1. <?php
  2.  
  3. $tab = file('plik_z_danymi');
  4. foreach($tab as $linijka) {
  5.  $tab_tmp = explode(':', $linijka);
  6.  $tab_wynikowa[$tmp_tab[0]] = $tmp_tab[1];
  7. }
  8.  
  9. asort($tab_wynikowa);
  10.  
  11. foreach($tab_wynikowa as $plik => $ilosc) {
  12.  echo $plik.' ma '.$ilosc.' wyswietlen<br />';
  13. }
  14. ?>
Upachi
Dzięki za szybką odpowiedź jednak to niestety nie rozwiązało mojego problemu. Otóż skrypt crash'a działa tak jak jest w orginale. Natomiast, kiedy ja "przerobie" go tak, aby pasował do mojego... To sortowanie działa jednak nie do końca, mianowicie sortowane są tylko pierwsze cyferki po ":" czyli wygląda to np. tak:

strona004.php:1
strona002.php:10
strona001.php:13
strona003.php:6
strona006.php:7

Tak samo jest ze skryptem krzycha. Wydaje mi się, że coś źle robię w moim skrypcie ( Poniżej jego kod. Tylko proszę się nie śmiać smile.gif on jest bardzo lamerski biggrin.gif )

Myślę że komentarze są zbędne biggrin.gif Ale na wszelki wypadek wolałem je dodać żeby nie było nieporozumień smile.gif

  1. <?php
  2.  
  3. $lst = "top10.lst";
  4. $dane = file($lst);
  5. $path = $_SERVER['PHP_SELF'];
  6. $plik = basename($path);
  7. $dane_t = array();
  8.  
  9. for( $x = 0; $x < count($dane); $x++ )    // Czytanie pliku
  10. {
  11. $linijka = $dane[$x];       // Odczytywanie kolejnej linikji
  12. $ile = strlen($dane[$x]);  // Sprawdzenie dlugosci linijki
  13.  
  14. for($i=0; $i < $ile; $i++)    // Przeszukanie linijki
  15. {
  16.  
  17. if($linijka[$i]==":")            // Jesli któryś znak w linijce to :
  18. {
  19. $spr = substr($linijka,0,$i);    // Sprawdz nazwe pliku (wszytko przed :)
  20.  
  21. if($spr == $plik)  // Jeśli nazwa pliku zgoda z plikiem który wykonal skrypt
  22. {
  23. $part_1 = substr($linijka,0,$i+1); 
  24. // Stworzenie pierwszej czesci wpisu
  25. $part_2 = substr($linijka,$i+1,$ile+1); 
  26. // Odczytanie ilosci dowiedzin (wszytko po :)
  27. $part_2 =  (real) $part_2;      
  28. // Zamiana ilosci odwiedzin na liczbe rzeczywista
  29. $part_2++;  
  30. // Zwiększenie ilosci odwiedzin o 1
  31. $dane[$x] = $part_1.$part_2."n";  
  32. // Zapisanie nowych danych
  33. }
  34. }
  35. }
  36. $dane_t[] = $dane[$x];    // Zapisanie nowej zawartosci w tabeli
  37. }
  38.  
  39. function sortuj( $x, $y ) // Sortuj od NAJWIEKSZEJ do NAJMNIEJSZEJ
  40. {
  41.    $x = substr( strstr( $x, ':' ), 1 );
  42.    $y = substr( strstr( $y, ':' ), 1 );
  43.    
  44.    if( $x == $y )
  45.    {
  46.       return 0;
  47.    }
  48.    return ( $x < $y ) ? 1 : -1;
  49. } 
  50.  
  51. usort( $dane_t, 'sortuj' );    // Sortowanie wynikow
  52.  
  53. print_r( $dane_t );
  54.  
  55. for( $x = 0; $x < count($dane); $x++ )    // Zapis do pliku
  56. {
  57. echo $dane_t[$x]."<br>";
  58. $nowe = implode("",$dane);
  59. $fs = fopen($lst,"w");
  60. fputs($fs, $nowe);
  61. fclose($fs);
  62. }
  63.  
  64. ?>


I tutaj odczytanie danych, uaktualnienie ich i zapis do pliku działa, ale lista sie niechce poprawnie posortować. Na tym przykładzie widać jak sortowana jest tablica dane_t

Będe wdzieczny za pomoc smile.gif

------------

P.S Już sobie poradziłem. W funkcji sortuj obie zmienne x i y zamieniłem na liczby rzeczywiste i działa. smile.gif.
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.