Výpis polí
Ř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 ?
23.2.2005 09:39:42
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.
23.2.2005 09:59:38
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)
23.2.2005 21:15:56
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.
22.2.2006 15:27:48
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);
?>
23.2.2005 10:36:01
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.)
23.2.2005 10:59:56
Lampa:
no pokud to jsou 3 ty selecty, tk nevim mozna byx to nacpal do jedne radky :) ale vypada to ne-prasacky :)
23.2.2005 10:45:19
dobrej postreh, vzpominam si, jak jsem to kdysi resil tou prvni variantou :)
23.2.2005 15:41:58
Havran:
Tak, tak - je pravdou ze tomuto pouzivaniu implode ma naucil az Python ;-).
23.2.2005 16:45:06
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...
23.2.2005 20:30:45
Bjarne:
No zatim mi to nepripada, ze by tu bylo neco pokrocileho. Pripada mi to jako seznamovani se s knihovnou fci a jazykem...
24.2.2005 11:12:10
Pavel Zbytovský:
Tuhle funkci jsem taky objevil už v manuálu.
24.2.2005 22:34:55
> máme pole, jehož prvky
co jsou to prosím prvky? To jako hodnoty?
4.3.2005 20:20:48
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.
12.3.2005 23:03:23
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..
22.4.2007 01:09:30
Slouží k tomu funkce str_split().
22.4.2007 13:39:38
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()
26.1.2009 05:30:40
<?php implode("</td><td>", array_map('htmlspecialchars', $pole)); ?>
26.1.2009 05:52:09