POWRÓT NA STRONĘ SZKOŁY

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 polu nazwa 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ętli while, 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 kluczach w Polsce, w Rosji oraz w 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: