Anglická verze
logolink

< Zpět na seznam lekcí

Vizualizace textového souboru na www stránce

PHPObsah lekce:

  • Problémy zpracování dat v řádku
  • Řešení 2 - rozdělení sloupců řádku do proměnných
  • Funkce explode
  • Příklad třísloupcové tabulky
  • Cvičení - konstrukt list
  • Domácí úkol

Problémy zpracování dat v řádku

Tato lekce navazuje na lekci Zpracování a úprava textového souboru v PHP.

Pojďme se nejprve zamyslet na nedostatky našeho řešení vizualizace textového souboru z předchozí lekce. Za jakých okolností nám nebude prosté nahrazení znaku středník pomocí značek buněk tabulky stačit?

  • Co kdyžbychom chtěli vypsat do stránky jen některé sloupce?
  • Co kdyžbychom chtěli vypsat do stránky sloupce v jiném pořadí?
  • Co kdyžbychom chtěli některé sloupce specificky upravit (např. formátovat telefonní číslo, e-mail)?
  • Co kdyžbychom chtěli místo tří sloupců jméno, příjmení a titul dát jen jeden (např. ve tvaru "Titul Přijmení Jméno")?
  • Co kdyžbychom chtěli zobrazit fotografii namísto pouhého jména souboru?

Všechny tyto otázky nás vedou k tomu, že bychom potřebovali nejen globální nahrazení celého řádku, ale potřebujeme mít možnost manipulovat s každým sloupcem zvlášť. Chtěli bychom mít každý sloupec zvlášť k dispozici a ten mít možnost libovolně upravit.

Řešení 2 - rozdělení sloupců řádku do proměnných

Ideální by pro nás bylo mít možnost udělat něco takového: "Dej mi do proměnné $jmeno obsah sloupce jméno, do proměnné $prijmeni hodnotu ze sloupce příjmení ... a pak do html napiš pouze některé z těchto informací dle potřeby.". K dosažení tohoto úkolu nám pomůže další z vestavěných funkcí php - funkce explode.

Funkce explode

K rozdělení řetězcové proměnné na jednotlivé části odělené oddělovačem lze v php použít například funkci explode (popis). Tato funkce vyžaduje alespoň dva parametry:

  • zdrojový řetězec - reprezentuje řetězec, který si přejeme rozdělit na části (v našem případě proměnná $radek).
  • oddělovač - tento parametr obsahuje oddělovač. To je řetězec, pomocí kterého jsou jednotlivé části řetězce odděleny.

Funkce pracuje tak, že vrátí pole, které bude mít tolik prvků, kolik měl zdrojový řetězec částí oddělených oddělovačem. Všimněte si, že pole v PHP standardně začíná indexem 0.

Použití funkce explode
$pole = explode(";",$radek);
vizualizace principu funkce explode

Po provedení toho příkazu už máme snadno dostupnou kteroukoliv hodnotu zvlášť. Můžeme tedy vypsat libovolnou kombinaci hodnot v libovolném počtu sloupců. Pojďme si tuto skutečnost ilustrovat na příkladu.

Příklad třísloupcové tabulky

Například bychom mohli chtít vypsat třísloupcovou tabulku, která by vypadala takto (Uvádíme pouze první dva řádky):

Příjmení, jméno, titul Zkratka Telefon
Babíková Eliška   577007450
Bárta Radim, Mgr. Bár 577007448

Již na prvních dvou řádcích vidíme několik problémových míst:

  • Ne všichni zaměstnanci mají titul. Na toto je potřeba při výpisu myslet.
  • Ne všichni zaměstnanci mají zkratku (není u nich potřeba, neboť nefigurují v rozvrhu).

Než upravíme náš stávající skript, tak se podíváme, které proměnné nás budou ve výpisu zajímat:

  • Jméno - pro přehlednost vytvoříme proměnnou $jmeno a do ní přiřadíme prvek pole $pole na pozici 0. Provedeme tedy příkaz $jmeno = $pole[0];
  • Příjmení - pro přehlednost vytvoříme proměnnou $prijmeni a do ní přiřadíme prvek pole $pole na pozici 1. Provedeme tedy příkaz $prijmeni = $pole[1];
  • Titul - pro přehlednost vytvoříme proměnnou $titul a do ní přiřadíme prvek pole $pole na pozici 2. Provedeme tedy příkaz $titul = $pole[2];
  • Telefon - pro přehlednost vytvoříme proměnnou $telefon a do ní přiřadíme prvek pole $pole na pozici 4. Provedeme tedy příkaz $telefon = $pole[4];
  • Zkratka - pro přehlednost vytvoříme proměnnou $zkratka a do ní přiřadíme prvek pole $pole na pozici 6. Provedeme tedy příkaz $zkratka = $pole[6];

Uvědomme si, že tyto proměnné jsme nemuseli vůbec vytvářet, ale udělali jsme to pouze pro přehlednost a dobré pochopení. Dokonce je vhodnější takové proměnné nevytvářet. Proč? Protože se v podstatě jedná o kopie existujících proměnných v poli a tím zbytečně vytváříme v paměti počítače kopie proměnných a náš skript tak potřebuje pro svůj běh více paměti. Těchto proměnných ještě v budoucnu využijeme, tak je necháme vytvořeny.

Skript upravíme následujícím způsobem:

Skript
<?php
error_reporting(E_ALL ^ E_NOTICE);
$nazev_souboru="data/zamestnanci.csv";
if (file_exists($nazev_souboru)) {
	$soubor=fopen($nazev_souboru, "r");
	if($soubor){
		$pocetradku = 0;
		while (!feof($soubor)){
			$pocetradku = $pocetradku + 1;
			$radek = fgets($soubor,5000);
			if ($pocetradku == 1) {
				print("<h1>".$radek."</h1>");
			} else {
				if ($pocetradku == 2){
					print("<table cellspacing=\"0\" cellpadding=\"0\">");
					print("<thead><tr><th>Příjmení, jméno, titul</th><th>Zkratka</th><th>Telefon</th></tr></thead>");
					print("<tbody>");
				}else{
					$pole = explode(";",$radek); 
					$jmeno = $pole[0];
					$prijmeni = $pole[1];
					$titul = $pole[2];
					$telefon = $pole[4];
					$zkratka = $pole[6];
					print("<tr>");
					print("<td>".$prijmeni." ".$jmeno);
					if ($titul<>""){
						print(", ".$titul); 
					}
					print("</td><td>".$zkratka."</td><td>".$telefon."</td>");
					print("</tr>");
				}
			}
		}
		print("</tbody>");
		print("</table>");
	} else {
		print("Soubor ".$nazev_souboru." se nepodařilo otevřít pro čtení."); 
	}
} else {
	print("Soubor ".$nazev_souboru." neexistuje.");
}
?>
              

Provedli jsme celkově dvě větší úpravy vnořené podmínky if ($pocetradku == 2). První spočívala v tom, že sloupce tabulky jsem napsali ručně a nevyužili jsme jejich názvy z csv souboru. Máme tak plnou kotrolu nad popisky sloupců.

Část skriptu generující hlavičku tabulky
if ($pocetradku == 2){
    print("<table cellspacing=\"0\" cellpadding=\"0\">");
    print("<thead><tr><th>Příjmení, jméno, titul</th><th>Zkratka</th><th>Telefon</th></tr></thead>");
    print("<tbody>");
}else{
          

Druhá úprava spočívá v použití funkce explode na rozřezání řádku na jednotlivé hodnoty do pole. Vytvořili jsme si proměnné pro jednotlivé informace z pole a vložili do nich patřičné hodnoty. Postup tvorby celého řádku tabulky je následující:

  1. Do html kódu stránky vložíme tag pro začátek řádku tabulky (print("<tr>");).
  2. Následuje značka pro začátek buňky tabulky následovaná svým povinným obsahem - příjmením a jménem.
  3. Před ukončením buňky se vyhodnotí, zda má daná osoba zadán titul a podle toho se buď napíše za jméno čárka a titul nebo se nestane nic.
  4. Uzavře se první buňka tabulky a přidají se další dvě se zkratkou a telefonem.
  5. Nakonec se vloží html značka pro konec řádku tabulky.
Část skriptu vypisující jednotlivé řádky tabulky
}else{
    $pole = explode(";",$radek); 
    $jmeno = $pole[0];
    $prijmeni = $pole[1];
    $titul = $pole[2];
    $telefon = $pole[4];
    $zkratka = $pole[6];
    print("<tr>");
    print("<td>".$prijmeni." ".$jmeno);
    if ($titul<>""){
        print(", ".$titul); 
    }
    print("</td><td>".$zkratka."</td><td>".$telefon."</td>");
    print("</tr>");
}
          

Cvičení - funkce list

Pokusme se na Internetu vyhledat informace o funkci PHP s nazvem list. Snažme se pochopit její funkci a zvažme její použití v našem programu. K čemu by nám mohla posloužit?

Funkce list

Funkce list umí, zjednodušeně řečeno, do seznamu proměnných přiřadit prvky pole (popis). Tato funkce má n parametrů - proměnných. Do "funkce" (jedná se spíše o konstrukt než o funkci) o n argumentech (n proměnných) se přiřadí pole. Výsledkem je, že v první z n proměnných je hodnota prvního prvku pole (prvek na nulté pozici v poli), v druhé proměnné je hodnota duhého prvku v poli...

Ukažme si chování konstruktu list na jednoduchém příkladu. Uvažujme pole $logininfo=(333,michalmiklas,XDfg4rF,Michal,Miklas). A proveďme příklaz list($uid,$login,$encryptedpasswd,$name, $surname) = $logininfo;. Co se stane? Výsledkem bude, že vznikne proměnná $uid s hodnotou 333, proměnná $login s hodnotou michalmiklas ... a nakonec proměnná $surname s hodnotou Miklas.

Použití funkce list
$list($promenna-0, promenna-1, ... , $promenna-n) = $pole; /* $pole by mělo mít n+1 prvků */

Řešení cvičení s konstruktem list

Konstrukt list použijeme ve skriptu místo jednotlivých příkazů $jmeno = $pole[0];, $prijmeni = $pole[1];,... pro naplnění hodnot z pole $pole do proměnných.

Část skriptu před použitím kontruktu list
}else{
    $pole = explode(";",$radek); 
    $jmeno = $pole[0];
    $prijmeni = $pole[1];
    $titul = $pole[2];
    $telefon = $pole[4];
    $zkratka = $pole[6];
    print("<tr>");
    print("<td>".$prijmeni." ".$jmeno);
    if ($titul<>""){
        print(", ".$titul); 
    }
    print("</td><td>".$zkratka."</td><td>".$telefon."</td>");
    print("</tr>");
}
          
Část skriptu s konstruktem list
}else{
	list($jmeno,$prijmeni,$titul,$email,$telefon,$fotografie,$zkratka) = explode(";", $radek);
    print("<tr>");
    print("<td>".$prijmeni." ".$jmeno);
    if ($titul<>""){
        print(", ".$titul); 
    }
    print("</td><td>".$zkratka."</td><td>".$telefon."</td>");
    print("</tr>");
}
          

Výsledný soubor z této lekce si můžete stáhnout: zpracovani-souboru-3.rar. V souboru je ponecháno zakomentované řešení bez konstruktu list.

Domácí úkol

Pokusme se nyní již téměř hotový skript upravit tak, aby vypsal pouze zaměstnance, kteří mají určen telefon.

Pokusme se do naší stránky před výpis tabulky se zaměstnanci (ale pod nadpis) napsat údaj o tom, kolik osob seznam obsahuje. Tzn. pod nadpisem bude například napsána věta "Celkový počet zaměstnanců je: " a celkový počet osob v dále vypsané tabulce.

Další čtení

Odkazy

Otázky

  1. Vysvětlete funkcionalitu výsledného skriptu z této lekce.
  2. Vysvětlete práci funkce explode a ukažte její použití na příkladu.
  3. Vysvětlete práci konstruktu list a ukažte jeho použití na příkladu.
webdesign, xhtml, css, php - Mgr. Michal Mikláš