Skocz do zawartości


Zdjęcie

[PHP] generowanie planu lekcji. [pętle, tablice].


  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 kurio

kurio

    Pan

  • 282 postów

Napisano 28 06 2009 - 01:52

Jest to mój pierwszy post od dosyc dlugiego czasu, dla tego właśnie chciałbym wszystkich gorąco powitać. Formalności mamy za sobą, dla tego przejdziemy już do praktyczniej części tego posta.

Napisałem kilka dni temu dosyć przydatny skrypt, który wypisuje nam plan lekcji na aktualny dzień.
Był to łatwy do napisania skrypt, jednak niekiedy nie jesteśmy sobie w stanie poradzić, nawet z takimi rzeczami. Opisze tutaj krok po korku jak należy budować taką funkcjonalność w PHP bez używania zewnętrznych plików oraz bazy danych.

Jeśli nie pliki tekstowe i bazy danych, to tablice. Elementy do tablic dopisujemy w następujący sposób:
<?php
//z gory definiujemy elementy tablicy:
$tablica = array('element1', 'element2', 'element3', 'element4');
//lub za pomoca funkcji array_push()
$tablica = array();
array_push($tablica, 'element1', 'element2, 'element3', 'element4');
?>
Kiest kilka dodawania elementow tablicy, jednak te dwa sa takimi podstawowymi.
W przypadku naszego kodu, użyjemy pierwszej metody i zdefiniujemy plan lekcji dla każdego dnia:
<?php
$poniedzialek = Array('Angielski','Rosyjski','W-F');
$wtorek = Array('Niemiecki','Polski','Matematyka','Fizyka');
$sroda = Array('Chemia','Rosyjski','W-F');
$czwartek = Array('Fizyka','Biologia','Matematyka');
$piatek = Array('Polski','Polski','Chemia');
//Trzymajac sie konwencji, $sobota i $niedziela to rowniez tablice.
$sobota = Array('Wolne!');
$niedziela = Array('Wolne!');
?>

Teraz, gdy mamy juz wpisane poszczegolne przedmioty do tablic, pora zajac sie ich printowaniem, ale najpierw musimy jakos rozroznic dni tygodnia, zeby interpreter wiedzial z ktorej tablicy dane ma wypisywac jakiego dnia.
W PHP 5.1.0 do funkcji date() dodano parametr 'N' ktory to zwraca integera z dnia tygodnia (integer - liczba calkowita), dla poniedzialku zwraca 1, dla wtorku 2 itd.
Potrzebna nam bedzie rowniez jakas instrukcja warunkowa, ktora bedzie wypisywac elementy odpowiedniej tablicy w zaleznosci od dnia tygodnia.
Wy tym przypadku najlepszym rozwiazaniem bedzie instrukcja switch, ktora to sprawdza po kolei warunki, i jezeli ktorys jest spelniony - realizuje instrukcje.
Jak bedzie to wygladac w praktyce:

<?php
$poniedzialek = Array('Angielski','Rosyjski','W-F');
$wtorek = Array('Niemiecki','Polski','Matematyka','Fizyka');
$sroda = Array('Chemia','Rosyjski','W-F');
$czwartek = Array('Fizyka','Biologia','Matematyka');
$piatek = Array('Polski','Polski','Chemia');
$sobota = Array('Wolne!');
$niedziela = Array('Wolne!');

$day = date('N');
switch($day):
	case 1:
		$plan_lekcji = $poniedzialek;
	break;
	
	case 2:
		$plan_lekcji = $wtorek;
	break;
	
	case 3:
		$plan_lekcji = $sroda;
	break;
	
	case 4:
		$plan_lekcji = $czwartek;
	break;
	
	case 5:
		$plan_lekcji = $piatek;
	break;
	
	case 6:
		$plan_lekcji = $sobota;
	break;
	
	case 7:
		$plan_lekcji = $niedziela;
	break;
endswitch;
?>
Widzimy, ze tylko jeden warunek na raz moze byc spelniony dla tej funkcji, akurat dzisiaj (niedziela) bedzie to warunek 7, gdzie $day przybralo wartosc 7 (co jest rowne case 7).

Gdy juz opracowalismy instrukcje warunkowa, trzeba zmusic interpreter aby jakos wypisal elementy tablicy, ktora zostala przypisana do zmiennej $plan_lekcji.
Uzyjemy do tego petli for, ktora wypiszemy sobie na ekran wszystkie elementy tablicy dla danego dnia.
Petla for potrzebuje do dzialania tak na prawde jednego parametru uzytego trzykrotnie, zazwyczaj nazywam go $i, gdyz tak nazywali go w ksiazkach czy tez kursach z ktorych sie uczylem.
for( $i=1; $i<30; $i++){}
$i=1 zaczynamy wykonywac petle od 1;
$i<30 konczymy wykonywac petle, gdy $i nie spelni warunku $i<30
$i++ inkrementowanie wartosci $i o jeden
W tym przypadku petla zostanie wykonana 28 razy.
dla for($i = 0; $i<=30; $i++){}
Petla zostala by wykonana 30 razy.
<?php
$poniedzialek = Array('Angielski','Rosyjski','W-F');
$wtorek = Array('Niemiecki','Polski','Matematyka','Fizyka');
$sroda = Array('Chemia','Rosyjski','W-F');
$czwartek = Array('Fizyka','Biologia','Matematyka');
$piatek = Array('Polski','Polski','Chemia');
$sobota = Array('Wolne!');
$niedziela = Array('Wolne!');

$day = date( 'N' );
switch( $day ):
	case 1:
		$plan_lekcji = $poniedzialek;
	break;
	
	case 2:
		$plan_lekcji = $wtorek;
	break;
	
	case 3:
		$plan_lekcji = $sroda;
	break;
	
	case 4:
		$plan_lekcji = $czwartek;
	break;
	
	case 5:
		$plan_lekcji = $piatek;
	break;
	
	case 6:
		$plan_lekcji = $sobota;
	break;
	
	case 7:
		$plan_lekcji = $niedziela;
	break;
endswitch;

for ( $i=0; $i<= sizeof( $plan_lekcji ) - 1; $i++; )
	 {
		 echo $plan_lekcji[$i].'<br />'; //printowanie kolejnych elementow tablicy i przejscie do nowego wiersza po kazdym elemencie.
	  }
?>

Jeszcze omowienie funkcji sizeof()
Praktycznie nigdy nie zdarza sie tak, zebysmy mieli kazdego dnia tyle samo lekcji. Przez co tyle samo elementow w tablicy, zwlaszcza, w $sobota i $niedziela, mamy tylko po jednym elemencie.
Dla tego tez wpisywanie jakiejs sztywnej wartosci w drugim warunku petli skutkowaloby errorem. Musimy wiec dynamicznie obliczac rozmiar tablic poprzez uzycie funkcji sizeof() ktora to przyjmuje jako wartosc, tablice ktorej rozmiar musimy policzyc. Zmiennej $i uzylem w 2 celach, do zrealizowania warunkow petli, oraz do wypisania odpowiednich elementow tablic.
Pierwszy element tablicy jest elementem [0], dla tego wlasnie pierwszy warunek petli wynosi 0. a drugi sizeof( $plan_lekcji ) - 1.
Oczywiscie moglibysmy po kolei wypisywac elementy tablicy w sposob:
echo $plan_lekcji[];
echo $plan_lekcji[];
echo $plan_lekcji[]; itd.
Jednak zawsze lepiej jest sobie okreslic, ktore elementy wypisujemy, bo tak na prawde nidgy dokladnie nie wiemy czy nie bedziemy potrzebowali wypisac elementow tablicy, nie koniecznie planu lekcji w kolejnosci odwrotnej, lub innej dowolnej kolejnosci.


Jesli znajdziecie jakies bledy, prosze mnie informowac, bede sie staral na bierzaco edytowac zawartosc.

  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych