PHP - znaki zodiaku na podstawie pliku tekstowego - pomysł 2

DZIAŁANIE:
ZnakIlość wystąpień
Skorpion4
Strzelec4
Waga3
Lew3
Panna3
Bliźnięta3
Ryby2
Rak2
Byk2
Koziorożec1
 

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.