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

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)); ?>

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 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.