Stosowanie tablic w PHP odzwierciedla nieco działanie baz danych. Spełniają niemal identyczną funkcję, z tym jednak wyjątkiem, że dane zdefiniowane do tablicy podczas jednorazowego działania skryptu są tracone przy ponownym uruchomieniu tego skryptu.
Jeśli nie bardzo rozumiesz o co mi chodzi to wytłumaczę to na przykładzie. Baza danych składa się z tablic podzielonych na wiersze i kolumny. Kiedy wpisujesz do niej dane i zapisujesz to są one widoczne przy każdym uruchomieniu bazy, dopóki ich nie usuniesz. Jeśli chodzi o tablice w PHP to zapisane do nich dane podczas działania jakiegoś skryptu są tracone wraz z zakończenie jego pracy.
Jedynym rozwiązaniem na zapis tych danych to zapis ich do pliku tekstowego lub do bazy danych. Tak więc wynika z tego, że same tablice nie zapewniają nam skutecznego sposobu na przechowywanie danych. Jeśli jednak wykorzystasz umiejętności łączenia tablic z danymi pobieranymi z plików tekstowych lub baz danych to osiągniesz bardzo dobry efekt. Pod koniec tego artykułu napiszę skrypt, który będzie działał właśnie na takiej zasadzie. Jeśli nie posiadasz jeszcze umiejętności operacji na plikach tekstowych przeczytaj odpowiedni artykuł – łatwiej będzie Ci zrozumieć cały kod.
Na dobry początek przybliżę Ci nieco budowę samych tablic. Każda tablica składa się z indeksów – unikalnych wskaźników na dany element – i elementów, czyli wartości jakie są przechowywane w tablicy pod wskazanym indeksem. Przykładem prostej tablic może być:
| $tablice[0] = ‘1 wartość’; $tablice[1] = ‘2 wartość’; |
Zapewne zastanawiasz się, dlaczego pierwszą wartość przypisaliśmy tablicy o indeksie ‘0’. Otóż indeksowanie tablic zawsze zaczyna się od ‘0’, a nie od ‘1’. Musisz sobie to zapamiętać, gdyż później możesz mieć z tym sporo problemów. Pragnę jednak zwrócić uwagę, że nie jest konieczne wpisywanie wartości do tablicy indeksowanych od ‘0’ – możesz zdefiniować nawet jako pierwszy element indeks ‘99’. Wszystkie poprzednie indeksy będą wskazywały na wartość ‘0’.
W PHP jak i wielu innych językach istnieje możliwość indeksowania tablic za pomocą liter alfabetu. Ich nazwa to tablice asocjacyjne, a konstrukcja przebiega podobnie do zwykłych tablic:
| $tablice[‘aa’] = ‘1 wartość’; $tablice[‘ab’] = ‘2 wartość’; |
W przykładzie podany indeks zapisany został za pomocą apostrofów. Możesz także używać cudzysłowów albo w ogóle nie używać żadnego z tych znaczników. Wszystkie kody zostaną poprawnie zastosowane.
Do tablic, tak samo jak do zwykłych zmiennych, możesz zapisać zarówno ciąg znaków, jak wartość liczbową.
Zapis danych do tablicy
Dane zapisywane są do tablic w różny sposób. Podstawową formę już poznałeś. Podajesz wartość indeksu, np. ‘0’, ‘aa’, a następnie przypisujesz im wartość. Czasami jednak sposób ten mija się z celem, np. trzeba tworzyć dodatkowe pętle i zmienne. Warty zwrócenia uwagi w tym wypadku jest sposób automatycznej inicjalizacji tablic. Aby to osiągnąć nie możesz podać żadnej wartości między nawiasami kwadratowymi. W ten sposób PHP sam tworzy odpowiednie indeksy począwszy od indeksu o wartości ‘0’. Dla uwidocznienia pokaże to na przykładzie:
| $tablice[] = ‘1 wartość’; $tablice[] = ‘2 wartość’; |
Ta definicja odpowiada takiemu zapisowi:
| $tablice[0] = ‘1 wartość’; $tablice[1] = ‘2 wartość’; |
Mam nadzieję, że zrozumiałeś o co mi chodzi. Warte zwrócenia uwagi jest także to, że ten sam efekt automatycznej inicjalizacji możesz osiągnąć stosując funkcję array(). Jej działanie wyjaśnię na przykładzie:
| $tablice = array(‘1 wartość’, ‘2 wartość’); |
W ten sposób zdefiniowałem dwa pierwsze – począwszy od ‘0’ – indeksy o wartościach ‘1 wartość’ i ‘2 wartość’. Jeśli jednak chcesz samemu nadać wartości odpowiednim indeksom to także możesz skorzystać z tej funkcji:
| $tablice = array(0 => ‘1 wartość’, 1 => ‘2 wartość’); |
Dzięki operatorowi ‘=>’ możemy przypisać dowolnemu elementowi odpowiedni indeks.
Przeglądanie tablic
Do przeglądania tablic przeważnie stosuje się pętle. Jeśli nie wiesz czym one są to przeczytaj odpowiedni artykuł – jest to podstawa każdego języka programowania i musisz je poznać.
Na początku przedstawię sposób przeglądania tablic, których znamy wartość ostatniego indeksu. Aby tego dokonać stwórz przykładową tablice, która będzie zawierać wartości liczbowe od 10 do 20:
$tablica = array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
Teraz kiedy mamy już gotową tablicę, łatwo policzyć, że zawiera ona 10 elementów. Pamiętając, że tablice są indeksowane od ‘0’ zastosuję pętle for() dla przedstawienia sposobu przechodzenia po wszystkich jej elementach.
| for ($i=0; $i < 10; $i++) { print $tablica[$i].’<br>’; } |
Teraz wystarczy, że uruchomisz powyższy skrypt i wszystkie elementy tablic powinny być wyświetlone w kolejności rosnącej.
Bardzo często zdarza się, że nie wiesz ile indeksów zawiera Twoja tablica. Bardzo pomocna jest wtedy funkcja count(). Jako jedyny argument podajesz tylko nazwę tablicy, a funkcja ta zwraca liczbę jej elementów, np.
| $tablica = array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); $ile = count($tablica); print “Tablica \$tablica zawiera <b>$ile</b> elementów!”; |
Teraz pokażę na przykładzie jak wykorzystać tą funkcję przy przeglądaniu tablic:
| $tablica = array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); $ile = count($tablica); for ($i=0; $i < $ile; $i++) { print $tablica[$i].’<br>’; } |
Przykład ten nie jest tak wcale skomplikowany, a jego konstrukcja jest wykorzystywana przez wielu doświadczonych programistów.
Ten sam albo lepszy efekt możesz także osiągnąć korzystając z pętli while(), do…while() lub foreach(). Ich stosowanie jest zależne tylko od ciebie, ale dla lepszego zrozumienia pokażę ich konstrukcje na przykładzie:
| $tablica = array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); $ile = count($tablica); |
Pętla for():
| print ‘<b>Przykład zastosowania na pętli for():</b><br>’; for ($i=0; $i < $ile; $i++) { print $tablica[$i].’<br>’; } |
Pętla while():
| $i=0; print ‘<b>Przykład zastosowania na pętli while():</b><br>’; while ($i < $ile) { print $tablica[$i].’<br>’; $i++; } |
Pętla do…while():
| $i=0; print ‘<b>Przykład zastosowania na pętli do…while():</b><br>’; do { print $tablica[$i].’<br>’; $i++; } while ($i < $ile) |
Pętla foreach():
| print ‘<b>Przykład zastosowania na pętli foreach():</b><br>’; foeach($tablica as $element) { print $element.’<br>’; } |
Przeglądanie tablic niesekwencyjnych
Jeśli chodzi o przeglądanie tablic sekwencyjnych to już chyba sobie poradzisz, ale co jeśli chodzi o tablice niesekwencyjne?? Są to takie tablice, których elementy nie są poukładane po kolei. Sam problem ich przeglądania nie jest tak skomplikowany, bo jeśli wiesz, który element jakie przechowuje dane, to sobie poradzisz. Załóżmy jednak, że pierwszy zdefiniowany fragment Twojej tablicy będzie miał indeks o wartości ‘9999’. Zwróć uwagę na czas przetwarzania takiej tablicy. PHP musi przejść przez wszystkie puste elementy tablicy i to zajmuje mu więcej czasu. Teraz postaram się przedstawić sposób na częściowe bądź całkowite rozwiązanie tego problemu.
Podobnie jak przy operacji na plikach lub katalogach, tak i w tablicach wykorzystuje się wewnętrzny wskaźnik, który umożliwia przemieszczanie się po elementach tablicy. Do zwracania bieżącego elementu tablicy używamy funkcji current() – od angielskiego słowa current – bieżący. Jako jedyny argument podajemy tu nazwę tablicy. Tak więc:
| $tablica[15] = ‘1 wartość’; $tablica[2] = ‘2 wartość’; $tablica[44] = ‘3 wartość’; $tablica[123] = ‘4 wartość; $aktualny = current($tablica); |
Teraz po zdefiniowaniu elementów tablicy wykorzystaliśmy funkcję current(), której wynik działania przypisaliśmy zmiennej $aktualny. Możesz teraz wypisać jej wartość na ekranie:
print ‘Bieżący element wskazuje na ‘.$aktualny.’<br>’;
Za pewne zauważyłeś, że na ekranie została wyświetlona wartość wskazywanego elementu. Co jeśli jednak chcesz wiedzieć jaka jest wartość indeksu aktualnie wskazywanego elementu?? Służy do tego funkcja key() – z angielskiego key – klucz. W przykładzie skorzystam z poprzedniego kodu:
| $wartoscIndkesu = key($tablica); print ‘Indeks bieżącego elementu wskazuje na ‘.$wartoscIndeksu.’<br>’; |
Wiesz już jak pobrać wartość bieżącego elementu i jego indeks, a co jeśli chodzi o przemieszczanie się między elementami tablicy. Posłużą nam do tego dwie funkcje: next() – z angielskiego next – następny – i prev() – z angielskiego preview – poprzedni. Obie te funkcje wymagają jednego argumentu, którym jest nazwa tablicy. Teraz na przykładzie pokażę ich konstrukcję:
| $tablica[15] = ‘1 wartość’; $tablica[2] = ‘2 wartość’; $tablica[44] = ‘3 wartość’; $tablica[123] = ‘4 wartość; $aIndeks = key($tablica); |
Przechodzimy dwa elementy dalej i wypisujemy jego indeks i wartość:
| next($tablica); next($tablica); print ‘Po przejściu do następnego elementu:<br>’; $aIndeks = key($tablica); |
Teraz cofniemy się o jeden indeks i też wypiszemy jego wartości:
| prev($tablica);
print ‘Po przejściu do poprzedniego elementu:<br>’; $aIndeks = key($tablica); |
A zatem wiesz już jak przeglądać tablice niesekwencyjne. Ponieważ bardzo rzadko stosuje się tablice, których elementy nie są ułożone kolejno, to sztuka ta przyda Ci się przy przechodzeniu przez elementy tablicy asocjacyjnej.
Bardzo pożytecznymi funkcjami okazują się być także funkcje list() i each(). Zmniejszają nakład pracy dzięki temu, że przy połączeniu z funkcją while() odczytują tylko te wartości z tablicy, które posiadają jakąś wartość:
| $tablica[15] = ‘1 wartość’; $tablica[2] = ‘2 wartość’; $tablica[44] = ‘3 wartość’; $tablica[123] = ‘4 wartość; |
| while(list($indeks, $wartosc) = each($tablica)) { print ‘Indeksu <b>’.$indeks.’</b> ma zapisaną wartość <b>’.$wartosc.’<br>’; } |
Funkcja each( zwraca tablice, której elementami są kolejno indeks i jego wartość. Nasz skrypt usprawniliśmy korzystając z funkcji list(), której argumentami są nazwy zmiennych, którym zostaną przyporządkowane wartości z tablicy powstałej przy wykorzystaniu funkcji each().
Wiesz już jak pobierać dane z tablicy i przechodzić między jej elementami, więc teraz zajmiemy się sposobami sortowania tablic.
Sortowanie tablic
Bardzo często zdarza się, że pobieramy dane, które nie są zapisane w interesującej nas kolejności. Trzeba wtedy ją posortować, co może przysporzyć nam nie lada problemów. PHP wyposażony został w szereg funkcji sortujących, dzięki czemu praca staję się łatwiejsza. Podstawową funkcją sortującą jest funkcja sort(). Zmienia ona wartości z podanej jako argument tablicy na wartości posortowane alfabetycznie (rosnąco), np.
| $tablica[0] = ‘mnop’; $tablica[1] = ‘efgh’; $tablica[2] = ‘abcd’; $tablica[3] = ‘ijkl; |
Teraz jak zastosujemy do tej tablicy funkcję sortującą:
sort($tablica);
to otrzymamy tak posortowaną tablicę:
| $tablica[0] = ‘abcd’; $tablica[1] = ‘efgh’; $tablica[2] = ‘ijkl; $tablica[3] = ‘mnop’; |
Jeśli chcesz to możesz sprawdzić działanie tej funkcji korzystając z pętli wykorzystywanych w poprzednich przykładach, np.
| while(list($indeks, $wartosc) = each($tablica)) { print ‘Indeksu <b>’.$indeks.’</b> ma zapisaną wartość <b>’.$wartosc.’<br>’; } |
Co jeśli jednak chcesz posortować tablicę w odwrotnej kolejności?? Posłuży nam do tego funkcja rsort(). Podobnie jak w funkcji sort() jej jedynym argumentem jest nazwa tablicy. Jej działanie jest identyczne jak w poprzednim przykładzie, z tą jednak różnicą, że elementy będą posortowane malejąco.
Problem może się pojawić dopiero przy sortowaniu tablic asocjacyjnych. PHP jest wyposażony do tego celu w funkcje asort() i arsort(), które są kolejno odpowiednikami funkcji sort() i rsort(). Gdybyś zastosował tu funkcję sort() to posortowane elementy tablicy asocjacyjnej zmieniły by wartości indeksów z ciągu znaków na wartości liczbowe. Zatem do sortowania tablic asocjacyjnych powinieneś korzystać tylko z przeznaczonych dla nich funkcji.
Istnieje jeszcze jedna funkcja sortująca przeznaczona dla tablic asocjacyjnych. Jest to funkcja ksort() i umożliwia ona sortowanie indeksów tablicy asocjacyjnej. Jej działania nie będę już przedstawiał, gdyż możesz je sam sprawdzić na podstawie pierwszego skryptu sortującego. Będzie to dla ciebie także dodatkowe ćwiczenie.
Skrypt na zakończenie
Tak to obiecałem na początku artykułu na zakończenie napisze krótki skrypt logowania oparty na plikach tekstowych i tablicach.
Otwórz dowolny edytor tekstowy, np. notatnik i zapisz nowy dokument jako ‘sortowanie.php’. Teraz postępuj zgodnie z zaleceniami, a przestawiony przeze mnie kod wpisuj do edytora.
Przy pisaniu skryptu będę wykorzystywał język HTML, ale nie będę go opisywał, gdyż wychodzę z założenia, że znasz już podstawy tego języka.
| <? // Dane: $dane = ‘dane.txt’; // plik z cytatami ?> <html> <head> <title>:: Sortowanie tablic :: by PHP.WebInside.Pl</title> <meta http-equiv=Content-Type content=”text/html; charset=iso-8859-2″> <meta http-equiv=Pragma content=NoCache> </head> <body> <center> <h2>Sortowanie tablic</h2> <table cellpadding=0 cellspacing=0 width=750 height=*> <? if (!$_POST[jak]) { ?> <form method=post> <tr> <td width=40% height=*>Sortuj tablicę według:</td> <td width=60% height=*> <select name=jak> <option value=rosnaco selected>rosnąco…</option> <option value=malejaca>malejąco…</option> </select> </td> </tr> <tr> <td></td> <td><input type=submit value=’Sortuj’></td> </tr> </form> <? } else { print ‘<tr> <td width=100% height=*>’; $plik = @file($dane); // pobranie danych z pliku print ‘<b>Pierwowzór tablicy wygląda tak:</b><br>’; while(list($numer, $tresc) = each($plik)) { print ‘» $numer – $tresc<br>’; } reset($plik); // ustawia wewnętrzny wskaźnik na początku tablicy if (($ile = @count($plik) > 0) { switch($jak) { case ‘rosnaco’: sort($plik); break; case ‘malejaco’: rsort($plik); break; default: sort($plik); break; } print ‘<b>a posortowana tablica tak:</b><br>’; while(list($numer, $tresc) = each($plik)) { print ‘» $numer – $tresc<br>’; } } else { print ‘Brak danych w pliku!<br>’; } print ‘</td> </tr> <tr> <td width=100% height=* align=center> <a href=javascript:history.back(-1);>Powrót do strony głównej!</a> </td> </tr>’; } ?> </table> </center> </body> </html> |
Teraz zapisz całość, a następnie otwórz nowy dokument i zapisz go jak ‘dane.txt’. Wpisz w kolejne wiesze przykładowe treści, np. niech to będą cytaty. Napisz ich co najmniej 10, każdy w innym wierszu.
Jak już skończysz to uruchom skrypt i sprawdź efekt. Możesz rozwinąć ten skrypt i wykorzystać do innych celów, ale to już Twoja w tym głowa.
