Výpis polí
Školení, která pořádám
Řekněme, že máme pole, jehož prvky chceme vypsat oddělené čárkami. Viděl jsem už spoustu pokusů, jak na to:
<?php
// neelegantní
$first = true;
foreach ($pole as $val) {
if (!$first) {
echo ", ";
}
echo $val;
$first = false;
}
// neelegantní
$tisk = "";
foreach ($pole as $val) {
$tisk .= ", $val";
}
echo substr($tisk, 2);
// to je ono
echo implode(", ", $pole);
?>
Funkce implode se dá použít i ve složitějších případech, někdo to ale už považuje za prasárnu:
<?php
echo "<tr><td>" . implode("</td><td>", $pole) . "</td></tr>\n";
mysql_query("SELECT * FROM tabulka WHERE id IN ('" . implode("', '", $pole) . "')");
?>
Diskuse
Lampa:
k mysql_query proc prasarna ?
kdyz mam pole obsahujici 300 zaznum s id a potrebuji je vybrat tak to mam udelat jak
a) 300 dotazu - nejsem prase ?
b) pouziji implode a udelam pouze jeden dotaz - jsem prase ?
Jeden dotaz místo 300 je samozřejmě v pořádku, někomu ale přijde přehlednější kód
<?php
foreach ($pole as $key => $val) {
$pole[$key] = "'$val'";
}
mysql_query("SELECT * FROM tabulka WHERE id IN (" . implode(", ", $pole) . ")");
?>
V těch apostrofech a uvozovkách se dá snadno zabloudit.
Podotýkám, že já osobně to za prasárnu nepovažuji.
Honza007:
Implode je super. Ale v kombinaci s SQL dotazem bych chtel upozornit, ze je zde velky problem toho co obsahuji polozky pole. Takze se nevyhnete tomu, ze musite projit kazdou polozku a kontrolovat pritomnost apostrofu. Ten foreach by mel tedy kontrolovat toto, pokud ne je tam zbytecny protoze jeho soucasna funkce se da provest samotnym implodem:
<?php
mysql_query("SELECT * FROM tabulka WHERE id IN ('" . implode("',' ", $pole) . "')");
?>
PS: otazkou je kdy se to stane neprehledne a prasarnou ;o)
Jan Veselý:
Problém s IN() je spíše v tom, že v případě většího počtu položek je hodně pomalé a mělo by se používat maximálně na řádově desítky položek. Pevné maximum je tuším 1500, ale nevím jestli pro MySQL, každopádně bychom se k tomuto číslu rozhodně neměli ani přiblížit :)
Jinak konstrukce s implode je dle mého v pořádku a také bych to neoznačoval za "prasárnu", spíše naopak.
F. Augusztin:
A co toto ? Je to "prasarna" alebo nie ? :-)
<?php
$query_list = array();
$query_list[]= "SELECT aaa FROM tabulka1";
$query_list[]= "SELECT bbb FROM tabulka2";
$query_list[]= "SELECT ccc FROM tabulka3";
$query = implode(" UNION ", $query_list);
mysql_query($query);
?>
Abraxis:
Tyhle veci vypadaji vzdycky samy o sobe "neskodne", ale zalezi na kontextu a na konkretnim ucelu pouziti (zda nemam nahodou zdrbany navrh tabulek, kdyz musim delat takove silenosti apod.)
Lampa:
no pokud to jsou 3 ty selecty, tk nevim mozna byx to nacpal do jedne radky :) ale vypada to ne-prasacky :)
dobrej postreh, vzpominam si, jak jsem to kdysi resil tou prvni variantou :)
Havran:
Tak, tak - je pravdou ze tomuto pouzivaniu implode ma naucil az Python ;-).
Michal Tuláček:
Tak minimálně bych ještě přidal někam ošetření, že mi do implde neleze něco jiného než pole... jinak to dělá nepěknou slotu...
Bjarne:
No zatim mi to nepripada, ze by tu bylo neco pokrocileho. Pripada mi to jako seznamovani se s knihovnou fci a jazykem...
Pavel Zbytovský:
Tuhle funkci jsem taky objevil už v manuálu.
> máme pole, jehož prvky
co jsou to prosím prvky? To jako hodnoty?
Niki:
Nahodou ja to donedavna taky delala tou prvni variantou nez jsem nekde narazila na tu s implode - proste me to samu od sebe nenapadlo...
Jen tak dal Nika.
Uncode:
mam řetězec:
$a="něco"
a chci ho prevest na pole:
<?php
$b[0]=n;
$b[1]=ě;
$b[3]=c;
$b[4]=o;
?>
jak se to da provest? fce explode() se zda nepouzitelna..
kuba:
echo "<tr><td>" . implode("</td><td>", $pole) . "</td></tr>\n";
Tohle mi přijde jako moc pěkný příklad, ale nějak si neumím poradit s tím, jak pustit na jednotlivé prvky pole htmlspecialchars()
Jakub Vrána :
<?php implode("</td><td>", array_map('htmlspecialchars', $pole)); ?>
Diskuse je zrušena z důvodu spamu.