Obsah lekce:
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?
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.
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.
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:
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.
$pole = explode(";",$radek);
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.
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ž upravíme náš stávající skript, tak se podíváme, které proměnné nás budou ve výpisu zajímat:
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:
<?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ů.
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í:
}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>"); }
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 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.
$list($promenna-0, promenna-1, ... , $promenna-n) = $pole; /* $pole by mělo mít n+1 prvků */
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.
}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>"); }
}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.
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.