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) . "')");
?>
Jakub Vrána, Výuka, 23.2.2005, diskuse: 18 (nové: 0)

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 ?

ikona Jakub Vrána OpenID:

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 :)

pif:

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...

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL: Reakce na: Michal Tuláček

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.

ikona Yuhů:

> 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..

ikona Jakub Vrána OpenID:

Slouží k tomu funkce str_split().

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()

ikona Jakub Vrána OpenID:

<?php implode("</td><td>", array_map('htmlspecialchars', $pole)); ?>
avatar © 2005-2022 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.