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
whileodbiera dane z kolejnych wierszy tabeli dopóty, dopóki w polunazwatabeli, 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
$miastajest 3-elementową tablicą asocjacyjną o kluczachw Polsce,w Rosjiorazw 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: