PHP - znaki zodiaku na podstawie pliku tekstowego - pomysł 2
| DZIAŁANIE: |
|
Kod:

Ewentualne Objaśnienia:
Oto drugie z rozwiązań ( lepsze ) zadania jakie spotkało
mnie na laboratorium z PHP na studiach, jego treść :
" Napisać stronę, która na podstawie pliku tekstowego CSV o formacie
nazwisko,data_urodzenia wyświetli statystykę występowania znaków zodiaku ".
To rozwiązanie jest o niebo lepsze od poprzedniego co widać od razu choćby po
wielkości kodu, jak widać tutaj wszystko opiera się ładnie na pętlach, a nie na
wielu warunkach, ale zobaczmy :
- jak poprzednio mamy tablicę ale tutaj dla każdego znaku określamy datę - dzień
i miesiąc kończący okres danego znaku zodiaku
- otwieramy nasz pliczek, rozpoczynamy pętle gdzie wykorzystujemy nowa funkcję
fgetcsv - jest to funkcja generalnie łącząca w sobie działanie 3 funkcji
takich jak fgets, chop oraz explode - tutaj 2 argument oznacza długość natomiast
3 znak, który stanowi podział , pierwszy oczywiście co dzielimy - czyli nasz
plik jest dzielony na tablicę $data , gdzie $data[0] = imię i nazwisko oraz
$data[1] = odczytana data urodzenia z pliku
- do zmiennej $data_urodzenia a właściwie tablicy znowu rozdzielamy naszą
odczytaną datę czyli $data[1], czyli to co nam trzeba to $data_urodzenia[1] =
miesiąc oraz $data_urodzenia[2] = dzień
- bierzemy sobie pętlę foreach która przechodzi przez naszą tablicę ze znakami
czyli $znaki, zmienna $znak będzie oznaczać znak zodiaku a zmienna $data datę
zakończenia trwania danego znaku rzecz jasna
- dzielimy zmienną $data na tablicę $dzien, czyli $dzien[0] = dzień miesiąca,
$dzien[1] = numer miesiąca
- wykorzystujemy dalej funkcję :
mktime - oblicza uniksowy znacznik czasu dla podanej daty,
składnia : mktime ( godzina, minuta, sekunda, miesiąc, dzień, rok [
letni/zimowy ] ) .
Zwracany znacznik czasu jest liczbą całkowitą długą (long integer) zawierającą
liczbę sekund, która upłynęła do podaje daty od 1 stycznia 1970 . Argumenty mogą
być opuszczane w kolejności od prawej do lewej. Za każdy pominięty argument
będzie wówczas wstawiona aktualna wartość, zgodnie z lokalnym czasem/datą.
Argument letni/zimowy może być ustawiony na 1, jeśli to czas zimowy, lub 0 jeśli
letni, lub -1 (domyślnie) jeśli niewiadomo, czy letni czy zimowy. Jeśli
niewiadomo, PHP spróbuje ustalić to samodzielnie. Może to powodować
nieoczekiwane (ale na pewno poprawne) wyniki.
Ostatni dzień dowolnego miesiąca może być wyrażony jako zerowy dzień następnego
miesiąca, ale nie jako -1 dzień - czyli na przykład ostatni dzień maja :
$last = mktime (0,0,0,6,0,2007);
echo strftime ("Ostatni dzień maja 2007 to: %d", $last);
Jak widać w przykładzie godziny, minuto oraz sekundy podajemy jako 0, roku
nie podajemy. Czyli porównujemy dwie zwrócone przez funkcję liczby - zwrócone z
dnia i miesiąca .
- co dalej - w pętli porównujemy liczby ( czyli generalnie dzień i miesiąc z
daty urodzenia z naszego pliku z dniem i miesiącem z tabeli znaków ) -
sprawdzanie jest od dołu, czyli od stycznia w górę - zwróćcie uwagę na zapis
znaku Koziorożca - 13 jako data zakończenia roku - należy tak to zrobić bo
Koziorożec jest i w grudniu i w styczniu.
Jeżeli w pętli warunek się zgadza - czyli odczytana data jest mniejsza od tej z
tablicy - sprawdzane jest jeszcze czy klucz tablicy czyli $znak == 13 jeżeli tak
inkrementowana jest tablica $statystyka o indeksie Koziorożec, w przeciwnym
wypadku element tablicy $statystyka o kluczu odpowiadającym zmiennej $znak czyli
indeksie tablicy $znaki ( czyli nazwie znaku zodiaku ).
- po tym musi wystąpić instrukcja break aby pętla została przerwana, rzecz jasna
aby dalej nie porównywać tej samej wartości - daty odczytanej z pliku
- po wszystkim sortujemy naszą tablicę asocjacyjną malejąco według wartości oraz
w pętli foreach wyświetlamy wyniki .
To rozwiązanie jest jak widać dużo dużo lepsze od poprzedniego.