Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] skrypt sortujący daty...
Forum PHP.pl > Forum > PHP
shpaque
Witam serdecznie. Wpadłem na fajny pomysł w związku z którym mam prośbę o pomoc.

Chcę zrobić skrypt, który wyświetla mi dane z pliku aktualności w formacie:
  1. data|tytul|tresc
  2. 2013-11-05|Jakiś tytuł|Blebleble
na podane niże zasadzie:

2013-12-10|xxx|xxxxzxzxz
2013-11-20|xxx|xxzxzxzx
DATA AKTUALNA / DZISIEJSZA
2013-10-30|xxx|xxx
2013-09-10|xx|xx

powiedzmy ze z pobraniem daty sobie poradzę, rozbiciem jej również, ale jak zrobić żeby wyświetlało mi w środku aktualną datę, a np w górę 10 pozycji daty ascendycznie smile.gif a 10 pozycji do dołu daty nieaktualne w chronologii jak powyżej..?

dodatkowa rzecz, jak zrobić, żeby na innej podstronie obliczało i wyświetlało mi tylko najbliższą aktualność? Dla wyjaśnienia napiszę co to jest. W pliku są zapisane zawody z datami - chcę żeby wyświetlany był wpis najbliższych zawodów.
slash^
Czemu nie skorzystasz z mysql? są tam gotowe narzędzia do tego.

Mając pobrany plik w formacie ( 2013-11-05|Jakiś tytuł|Blebleble ) komendą file robisz na tych danych explode, później robisz na datach strtotime
shpaque
mysql nie probowalem nigdy, a php troche powiedzmy lykam,

ale czy strtotime przypadkiem nie dziala tylko w formacie pełnym? (01 January 1090), musiałbym rozchrzanić datę na wartości zamienić wartości miesięcy na pełne daty i dopiero?
slash^
A sprawdziłeś co strtotime "lyka"?

mysql nie próbowałeśquestionmark.gif? google -> pdo tutorial, kurs pdo
shpaque
dobra pomińmy na razie temat MySQL, jak będę miał chwilę to będę uczył się baz danych...

mam tak:
  1. <?
  2. $dateins = array();
  3. $dateouts = array();
  4. $titles = array();
  5. $citys = array();
  6. $streets = array();
  7. $poolnames = array();
  8. $poollengths = array();
  9. $results = array();
  10. $database = "./db/zawody.db";
  11. $items = file($database);
  12. $last = count($items)-1;
  13.  
  14. for($i = $last; $i > $last - 1; $i--) {
  15. list($datein, $dateout, $title, $city, $street, $poolname, $poollength, $result) = explode('|', $items[$i]);
  16. $dateins[$count] = $datein;
  17. $dateouts[$count] = $dateout;
  18. $titles[$count] = $title;
  19. $citys[$count] = $city;
  20. $streets[$count] = $street;
  21. $poolnames[$count] = $poolname;
  22. $poollengths[$count] = $poollength;
  23. $results[$count] = $result;
  24.  
  25. $datastartu = $dateins[$count];
  26. $datadzisiaj = date('y-m-d');
  27.  
  28. list($year, $month, $day) = split('[/.-]', $datastartu);


co teraz?
slash^
Odczytujesz dane z pliku funkcja file, masz tablice elementów, funkcjami foreach i explode tworzysz tablicę wielowymiarową w której jedna kolumna odpowiada dacie, traktujesz ją strtotime, teraz możesz te dane posortować i wybrać odpowiednimi warunkami daty "większe" i "mniejsze" od "dziś".
rocktech.pl
Witam.

Proponuję podejście obiektowe bez file, foreach, explode, strtotime.

  1. class SortDataHeap
  2. extends SplHeap
  3. {
  4. public function compare($v1, $v2)
  5. {
  6. if ( new DateTime($v1[0]) == new DateTime($v2[0]) ) {
  7. return 0;
  8. }
  9. return ( new DateTime($v1[0]) < new DateTime($v2[0])) ? -1 : 1;
  10. }
  11.  
  12. }
  13.  
  14. $heap = new SortDataHeap();
  15. $file = new SplFileObject('plik.csv');
  16.  
  17. while ( $file->valid() ) {
  18. $heap->insert($file->fgetcsv('|'));
  19. }
  20.  
  21. while ( $heap->valid() ) {
  22. echo $heap->current()[0] . PHP_EOL;
  23. $heap->next();
  24. }
shpaque
  1. echo $heap->current()[0] . PHP_EOL;


tu jest jakiś babol
nospor
$cur = $heap->current();
echo $cur[0] . PHP_EOL;
rocktech.pl
Przepraszam babol dla:

  1. (PHP_VERSION_ID < '50400')
shpaque
...teraz już się całkiem pogubiłem... Tak na marginesie z góry dziękuję za pomoc smile.gif


Jeszcze raz można poprosić kod powyższy ale bez błędów?
rocktech.pl
Sprostowanie.

Patrz http://us1.php.net/manual/en/migration54.new-features.php

Cytat
- Function array dereferencing has been added, e.g. foo()[0].



  1. class SortDataHeap
  2. extends SplHeap
  3. {
  4.  
  5. public function compare($v1, $v2)
  6. {
  7. if ( new DateTime($v1[ 0 ]) == new DateTime($v2[ 0 ]) ) {
  8. return 0;
  9. }
  10. return ( new DateTime($v1[ 0 ]) < new DateTime($v2[ 0 ])) ? -1 : 1;
  11. }
  12.  
  13. }
  14.  
  15. $heap = new SortDataHeap();
  16. $file = new SplFileObject('Q.csv');
  17.  
  18. while ( $file->valid() ) {
  19. $heap->insert($file->fgetcsv('|'));
  20. }
  21.  
  22. while ( $heap->valid() ) {
  23. $cur = $heap->current();
  24. echo $cur[ 0 ] . PHP_EOL;
  25. $heap->next();
  26. }
shpaque
nic nie rozumiem z tego skryptu, poza tym po jego umieszczeniu w kodzie gdzieś 200 linijek dalej wywala mi błąd... Może dałoby się wrócić do skryptu z użyciem foreach i tak dalej..?

nikt mi nie pomoże?
rocktech.pl
Cytat
j wywala mi błąd...


Postaraj się proszę doprecyzować bo tak rzeczywiście nikt Ci nie pomoże ...
shpaque
nie chodzi już o błąd - bo tego kodu nie pojmę, za to pojmę kod / skrypt oparty na ww. czyli file, explode, foreach... A błąd mi wywala z jakimś DIVem chyba (skoro paręset linijek dalej) ale nie wiem
Malukaz
ło zabawe sobie robisz, mysql w chwile byś to napisał.

Proponuje daty na unix zmienić i potem sortować tym
shpaque
zrobmy to od początku. mam takie coś:

  1. <?php
  2. $dateins = array();
  3. $dateouts = array();
  4. $titles = array();
  5. $citys = array();
  6. $streets = array();
  7. $poolnames = array();
  8. $poollengths = array();
  9.  
  10. $id = isset($_REQUEST['id']) ? $_REQUEST['id'] : '';
  11. $count = 0;
  12. $kodindex = -1;
  13. $teraz = time();
  14. $database = './db/zawody.db';
  15. $items = file($database);
  16.  
  17. foreach($items as $line)
  18. {
  19. list($datein, $dateout, $title, $city, $street, $poolname, $poollength) = explode('|', trim($line));
  20. $dateins[$count] = $datein;
  21. $dateouts[$count] = $dateout;
  22. $titles[$count] = $title;
  23. $citys[$count] = $city;
  24. $streets[$count] = $street;
  25. $poolnames[$count] = $poolname;
  26. $poollengths[$count] = $poollength;
  27.  
  28. if ($id == strtotime($datein))
  29. {
  30. $kodindex = $count;
  31. }
  32. $count++;
  33.  
  34. for ($i = $count; $i > 0; $i--)
  35. {
  36. echo $dateins[$i];
  37. echo $dateouts[$i];
  38. echo $titles[$i];
  39. }
  40. }
  41. ?>


1. chcę żeby mi wyświetlił wpis najbliższy dzisiejszej dacie, ale który będzie
2. -||-, ale który był.

jak zrobić żeby wyświetlił mi różnicę najmniejszą ze wszystkich w pliku, ale nie równą dacie dzisiejszej?

w końcu do tego miejsca doszedłem w mękach i bólu sam, ale po resztę muszę założyć nowy temat, bo ludzie widzę nie chcą czytać - kurdę czy to tak trudno pomóc komuś komu zajmie to 5 minut? A ja musiałem nad głupimi kilkoma linijkami męczyć się przez tydzień... Temat do zamknięcia.
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.