← Lekcje
PHP · lekcja 02

Tablice w PHP: zwykłe i asocjacyjne

Wiele wartości w jednej zmiennej

  1. Powtórka: zmienne, kropka, echo
  2. Tablica: elementy ponumerowane od zera
  3. Tablica asocjacyjna: elementy z własnymi kluczami
  4. Ćwiczenie: plik arrays.php z listą gier i planem dnia
Rozgrzewka · 3 minuty

Trzy pytania z poprzedniej lekcji

  1. Po czym PHP poznaje, że $age to zmienna, a age nie?
  2. Co wypisze echo "Ala" . "ma" . 5;?
  3. Czym różni się echo "Cześć $name"; od echo 'Cześć $name';?
Część 1 · Po co tablica?

Pięć gier, jedna zmienna

Bez tablicy potrzebujecie pięciu zmiennych: $game1, $game2… Tablica to jedna zmienna z wieloma szufladami. Każda szuflada ma numer, zaczynając od 0.

$games 0 Minecraft 1 Fortnite 2 FIFA 3 Rocket League 4 Among Us żółty numer = indeks · pierwsza szuflada ma numer 0, nie 1
PHP Manual: Arrays („ordered map”: wartości przypisane do kluczy) · php.net/manual/en/language.types.array.php
Część 1 · Przepisujemy i uruchamiamy

Tworzenie, odczyt, dopisanie

$games = ["Minecraft", "Fortnite", "FIFA", "Rocket League", "Among Us"];

echo $games[0];        // Minecraft   (pierwszy element)
echo $games[4];        // Among Us    (ostatnia z pięciu)

$games[] = "Tetris";    // dopisz na koniec: dostaje numer 5
echo count($games);    // 6   (ile elementów jest w tablicy)

Nawiasy kwadratowe [ ] tworzą tablicę. Elementy oddzielacie przecinkiem. Puste [] po nazwie znaczy: dołóż nowy element na końcu.

PHP Manual: Arrays (składnia [], odczyt array[key], $arr[] = value) · php.net/manual/en/language.types.array.php · PHP Manual: count · php.net/manual/en/function.count.php
Część 2 · Tablica asocjacyjna

Szuflady z podpisami

$student = [
    "name" => "Anna",
    "age"  => 18,
    "city" => "Warszawa",
];

echo $student["name"];  // Anna
echo $student["age"];   // 18
klucz wartość "name" "Anna" "age" 18 "city" "Warszawa" strzałka w kodzie to =>

Zamiast numeru każda szuflada ma podpis (klucz). Klucz to tekst w cudzysłowie albo liczba. Wartość może być dowolna. Strzałka => czytamy: „klucz wskazuje na wartość”.

Ciekawostka z PHP Manual: kluczem tablicy może być tylko liczba całkowita albo tekst, więc PHP dopasowuje do tego inne wartości. Liczba z przecinkiem jako klucz traci część po przecinku (8.7 zamienia się w 8), a klucz null zamienia się w pusty tekst.

PHP Manual: Arrays („The key can either be an int or a string. The value can be of any type”) · php.net/manual/en/language.types.array.php · ciekawostka: tamże, sekcja Syntax („Floats are also cast to ints, which means that the fractional part will be truncated”; „Null will be cast to the empty string”)
Część 3 · Jak zobaczyć całą tablicę?

Podgląd print_r i wypisanie foreach

print_r($student);
// Array
// (
//     [name] => Anna
//     [age] => 18
//     [city] => Warszawa
// )

Do szukania błędów. Pokazuje wszystkie klucze i wartości. W przeglądarce włączcie „Pokaż źródło”, żeby zobaczyć wcięcia.

echo "<ol>";
foreach ($games as $game) {
    echo "<li>$game</li>";
}
echo "</ol>";

foreach ($student as $key => $value) {
    echo "<li>$key: $value</li>";
}

foreach czytamy: „dla każdego elementu z tablicy zrób…”. Dziś tylko jako sposób wypisania. Pętle w całości na kolejnych lekcjach.

PHP Manual: print_r · php.net/manual/en/function.print-r.php · PHP Manual: foreach („On each iteration, the value of the current element is assigned to $value”; forma z $key => $value) · php.net/manual/en/control-structures.foreach.php
Część 4 · Tablica w tablicy

Szafka w szafce

$students = [
    ["name" => "Anna",   "grade" => 5],
    ["name" => "Bartek", "grade" => 4],
];

echo $students[0]["name"];   // Anna
echo $students[1]["grade"];  // 4

Wartością szuflady może być cała kolejna tablica. Czytacie od lewej: najpierw numer ucznia, potem podpis pola.

$students 0 "name""Anna" "grade"5 1 "name""Bartek" "grade"4
PHP Manual: Arrays („As array values can be other arrays, trees and multidimensional arrays are also possible”) · php.net/manual/en/language.types.array.php
Część 5 · Zanim zawołasz o pomoc

Typowe błędy

Co piszecieCo się dziejePoprawka
$games[1] „bo to pierwsza gra”wypisze DRUGĄ grę, numeracja od 0pierwsza to $games[0], ostatnia $games[count($games) - 1]
$student["email"], a klucza nie maWarning: Undefined array key "email", wynik null (puste miejsce)sprawdźcie literówkę w kluczu, print_r pokaże, jakie klucze są
$student[name] bez cudzysłowuPHP szuka stałej name (nazwy bez $), błądklucz tekstowy zawsze w cudzysłowie: $student["name"]
"age" = 18 albo "age" : 18błąd składnistrzałka to dokładnie =>; >= też przejdzie bez błędu, ale zrobi porównanie, nie parę klucz i wartość
brak przecinka między elementamibłąd składni z numerem liniiprzecinek po każdym elemencie, po ostatnim też wolno
PHP Manual: Arrays („Attempting to access an array key which has not been defined… an E_WARNING-level error message… the result will be null”; przykłady z przecinkiem po ostatnim elemencie) · php.net/manual/en/language.types.array.php
Tablice · egzamin

Tak pytają na egzaminie

1. Która definicja tablicy asocjacyjnej w języku PHP jest poprawna składniowo?

  1. $age = array("Anna"=35, "Ewa"=37, "Oliwia"=43);
  2. $age = array([Anna, 35], [Ewa, 37], [Oliwia, 43]);
  3. $age = array("Anna"=>"35", "Ewa"=>"37", "Oliwia"=>"43");
  4. $age = array({"Anna", "35"}, {"Ewa", "37"}, {"Oliwia", "43"});

array(...) to starszy zapis tego samego, co [...]. Na egzaminie wciąż go spotkacie.

2. $tab = explode(",", "jelenie,sarny,dziki,lisy,borsuki");
echo $tab[1]." ".$tab[2];

Wskaż wynik wykonania przedstawionego kodu PHP, jeżeli zmienna tab jest tablicą.

  1. jelenie sarny
  2. lisy borsuki
  3. sarny dziki
  4. dziki lisy

explode dzieli tekst po przecinku i zwraca tablicę.

CKE, EE.09 styczeń 2022, zad. 7 · CKE, EE.09 styczeń 2021, zad. 7
Ćwiczenie 1 · przy komputerze · 12 minut

Ćwiczenie 1: arrays.php

  1. W folderze htdocs serwera utwórz plik arrays.php.
  2. Tablica $games z pięcioma Twoimi ulubionymi grami. Pod nią dopisz szóstą: $games[] = ...;
  3. Wypisz zdanie „Moje gry: 6” z count($games), a pod nim gry jako <ol> (foreach ze slajdu, <li> w środku).
  4. Tablica asocjacyjna $dayPlan: klucz to godzina ("7:00"), wartość to czynność ("pobudka"), co najmniej 4 pary. Wypisz ją jako <ul>, w każdym punkcie „godzina: czynność” (foreach z $key => $value).
  5. Sprawdź w przeglądarce: localhost/arrays.php.

Ma się pojawić: „Moje gry: 6”, lista z numerami 1 do 6, pod nią lista z kropkami, np. „7:00: pobudka”. Zero ostrzeżeń „Warning”.

Zasady pracowni
Ćwiczenie 2 · na kartce lub w komentarzu · 5 minut

Ćwiczenie 2: co wypisze?

Bez uruchamiania. Zapisz wynik każdego fragmentu, potem sprawdź w XAMPP.

// A
$colors = ["czerwony", "zielony", "niebieski"];
echo $colors[1];

Co wypisze ten kod?

// B
$numbers = [10, 20, 30];
$numbers[] = 40;
echo count($numbers);

Co wypisze ten kod?

// C
$prices = ["bread" => 5, "butter" => 9];
echo $prices["bread"] + $prices["butter"];

Co wypisze ten kod?

// D
$days = ["pn", "wt", "sr"];
echo $days[3];

Co wypisze ten kod?

PHP Manual: Arrays (klucz niezdefiniowany) · php.net/manual/en/language.types.array.php
Na koniec

Sprawdź się

  1. Jaki numer ma pierwszy element w tablicy $games i dlaczego $games[5] to szósty element?
  2. Czym tablica asocjacyjna różni się od zwykłej i jaki przykład z życia pasuje do każdej?
  3. Co zrobi PHP, gdy odczytacie $student["email"], a takiego klucza nie ma?

Następna lekcja: operatory, czyli jak PHP liczy, porównuje i skleja.

Tablice · produkcja

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
$student = ["name" => "Anna"]Tak wygląda odpowiedź serwera dla aplikacji: tablica asocjacyjna zamieniona na tekst w formacie JSON (JavaScript Object Notation). json_encode($student) daje {"name":"Anna","age":18,"city":"Warszawa"}. Każde API (interfejs programu) napisane w PHP kończy się tym wywołaniem.nadal w użyciu
array(...) z zadań CKENowy kod pisze [...]. array() czytacie w starszych projektach i na egzaminie.zastępowane
print_r($student)Tylko podczas szukania błędu na własnym komputerze. W gotowej stronie nie ma go nigdy: wypisałby dane użytkowników na ekran.narzędzia
tablica w tablicy $studentsLista uczniów pobrana z bazy danych ma dokładnie ten kształt: tablica wierszy, każdy wiersz to tablica asocjacyjna z nazwami kolumn. Dane z formularza też przychodzą jako tablica ($_POST).nadal w użyciu
PHP Manual: json_encode · php.net/manual/en/function.json-encode.php · PHP Manual: Arrays (obie składnie)
← → slajdy · F pełny ekran · S spis