Tablice asocjacyjne
Wykonamy skrypty, w których zademonstrujemy operacje na tablicach asocjacyjnych.
Ćwiczenie 2_5_0_1. Obliczenie wyników sprzedaży w sklepie. Zastosowanie tablicy asocjacyjnej dwuwymiarowej
Należy zastosować dwa pliki. W pierwszym umieszczamy formularz umożliwiający wpisanie pięciu przykładowych towarów sprzedanych w sklepie.
<body>
<form action="wyniki.php" method="post">
<table>
<tr>
<th>Lp</th>
<th>Nazwa</th>
<th>Cena</th>
<th>Sztuk</th>
</tr>
<tr>
<th>1</th>
<td><input type="text" name="nazwa1" /></td>
<td><input type="text" name="cena1" /></td>
<td><input type="text" name="sztuk1" /></td>
</tr>
<tr>
<th>2</th>
<td><input type="text" name="nazwa2" /></td>
<td><input type="text" name="cena2" /></td>
<td><input type="text" name="sztuk2" /></td>
</tr>
<tr>
<th>3</th>
<td><input type="text" name="nazwa3" /></td>
<td><input type="text" name="cena3" /></td>
<td><input type="text" name="sztuk3" /></td>
</tr>
<tr>
<th>4</th>
<td><input type="text" name="nazwa4" /></td>
<td><input type="text" name="cena4" /></td>
<td><input type="text" name="sztuk4" /></td>
</tr>
<tr>
<th>5</th>
<td><input type="text" name="nazwa5" /></td>
<td><input type="text" name="cena5" /></td>
<td><input type="text" name="sztuk5" /></td>
</tr>
</table>
<input type="submit" name="pokaz_wyniki" value="Wyniki sprzedaży" />
</form>
</body>
Nietrudno zauważyć, że jest to tabela, przy czym w kolejnych jej komórkach umieszczone zostały pola input
typu text
formularza. Każdy wiersz tej tabeli (rekord) zawiera dane dotyczące sprzedaży jednego towaru. Proszę zwrócić uwagę, że kolejne atybuty name
w każdej kolumnie różnią się jedynie liczbą która kończy nazwę. Będzie to pomocne podczas pobierania danych przez skrypt PHP. Zastosujemy tam pętlę, która będzie uniwersalna - odbierze dane z tabel o różnej liczbie wierszy. Tak na marginesie, kostruowanie tej tabeli również warto by wykonać za pomocą PHP, ponieważ kod HTML dla tabeli o wielu wierszach zajmuje dużo miejsca.
W drugim pliku umieszczamy skrypt PHP, który obliczy:
- sumę sprzedaży;
- który towar sprzedano w największej ilości;
- sprzedaż którego towaru przyniosła największy przychód;
<?php
$nr=1;
while (isset($_POST['nazwa'.$nr]))
{
$towary[]=array('nazwa'=>$_POST['nazwa'.$nr], 'cena'=>$_POST['cena'.$nr],
'sztuk'=>$_POST['sztuk'.$nr]);
$nr++;
}
$suma_sprzedazy=0;
$ile_sprzedano_max=0;
$za_ile_sprzedano_max=0;
$nazwa_ile_sprzedano_max='';
$nazwa_za_ile_sprzedano_max='';
foreach ($towary as $towar)
{
$ile_sprzedano=$towar['sztuk'];
$za_ile_sprzedano=$ile_sprzedano*$towar['cena'];
$suma_sprzedazy+=$za_ile_sprzedano;
if ($ile_sprzedano>$ile_sprzedano_max)
{
$ile_sprzedano_max=$ile_sprzedano;
$nazwa_ile_sprzedano_max=$towar['nazwa'];
}
if ($za_ile_sprzedano>$za_ile_sprzedano_max)
{
$za_ile_sprzedano_max=$za_ile_sprzedano;
$nazwa_za_ile_sprzedano_max=$towar['nazwa'];
}
}
echo 'Sprzedano towary za kwotę: '.$suma_sprzedazy;
echo '<br />Towar który sprzedano w największej ilości to: '.$nazwa_ile_sprzedano_max;
echo '<br />Towar którego sprzedaż przyniosła największy przychód to: '
.$nazwa_za_ile_sprzedano_max;
?>
Proszę uważnie przejrzeć kod PHP:
-
Pętla
while
odbiera dane z kolejnych wierszy tabeli dopóty, dopóki w polunazwa
tabeli, istnieje pole formularza. -
Elastyczność PHP pozwala na uniwersalny zapis poszczególnch pól w kolejnych rekordach - np.
$_POST['nazwa'.$nr]
, gdzie$nr
, jest numerem rekordu, zgodnym z numeracją zastosowaną w formularzu. Dzięki temu, ten sam kod pętliwhile
, może odebrać dane z tabeli o dowolnej liczbie wierszy. -
Po raz pierwszy, spotykasz się w tym przykładzie z tabelą dwuwymiarową. Zwróć uwagę, że dane każdego wiersza tabeli są elementami tablicy asocjacyjnej o kluczach
nazwa
,cena
,sztuk
(dla ułatwienia nazwy te są takie same jak nagłówki kolumn tabeli, ale mogłyby być inne). Tak więc każdy wiersz jest tablicą oraz kolejnym elementem tablicy indeksowanej numerycznie$towary
.
Ćwiczenie 2_5_0_2. Odebranie do tablicy asocjacyjnej, danych wysłanych formularzem
Teraz coś bardzo prostego. Należy wysłać formularzem, następujące dane: kontynent, państwo, miasto, ulica. Dane umieścić w tablicy, a następnie je wyświetlić. Zastosuj kod PHP:
<?php
$dane=array('kontynent'=>$_POST['kontynent'], 'państwo'=>$_POST['panstwo'],
'miasto'=>$_POST['miasto'], 'ulica'=>$_POST['ulica']);
foreach($dane as $klucz=>$nazwa)
echo $klucz.' '. $nazwa.'<br />';
?>
Ćwiczenie 2_5_0_3. Przykład zastosowania tablicy asocjacyjnej dwuwymiarowej
Zastosuj następujący kod PHP:
<?php
$miasta=array
(
'w Polsce'=>array('Krasnystaw', 'Warszawa', 'Gdańsk', 'Wrocław'),
'w Rosji'=>array('Moskwa', 'Smoleńsk', 'Murmańsk', 'Woroneż'),
'w Niemczech'=>array('Berlin', 'Magdeburg', 'Drezno', 'Hamburg')
);
foreach($miasta as $gdzie=>$nazwy_miast)
{
echo 'Miasta '.$gdzie.': ';
foreach($nazwy_miast as $nazwa_miasta) echo $nazwa_miasta.', ';
echo '<br />';
}
?>
-
Zmienna
$miasta
jest 3-elementową tablicą asocjacyjną o kluczachw Polsce
,w Rosji
orazw Niemczech
. - Każdy z wymienionych w poprzednim punkcie elementów, jest 4-elementową tablicą indeksowaną numerycznie o indeksach od 0 do 3. Każdy element tych tablic jest nazwą miasta.
Jeżeli zapomniałeś jak przygotować i gdzie zapisywać pliki testowe: