Autor Zpráva
regy
Profil
Drazí programátoři,
nevíte prosím, jak např. ve funkci ereg_replace využít referenci jako název prvku?

$cisla['jedna'] = "1";
$cisla['dva'] = "2";
$cisla['tri'] = "3";

$text = "::jedna:: ::dva:: ::tri::";
$text = ereg_replace("::([^:]*)::","".$cisla['\\1']."",$text);
echo $text;


Potřeboval bych, aby program vypsal 1 2 3, ale nefunguje to. Máte nějaké nápady?
Předem díky
Majkl578
Profil
K tomu by se hodilo použít preg_replace_callback a provést tu operaci v callbacku.
Tori
Profil
Majkl578:
Už jsem se dlouho chtěla zeptat: Jsou proti používání modifikátoru e v preg_replace podobné výhrady, jako proti eval? V JavaScriptu se všechen kód zapisovaný jako řetězec bere dosti negativně, ale v PHP témách se to myslím zatím tolik neřešilo. Jestli byste třeba použil tohle, a pokud ne, tak proč ne? (předpokládejme PHP 5.2)
preg_replace("/::([^:]*?)::/e", '$cisla["\\1"]', $text);
Majkl578
Profil
[#3] Tori:
Zejména rychlost:
$cisla = array(
    'jedna'    => 1,
    'dva'    => 2,
    'tri'    => 3,
);

$text = '::jedna:: ::dva:: ::tri::';

$a = microtime(TRUE);
for ($i = 0; $i < 100000; $i++) {
    preg_replace('~::([^:]+)::~Ue', '$cisla[\'\1\']', $text);
}
echo microtime(TRUE) - $a;

echo '<br>';

$b = microtime(TRUE);
for ($i = 0; $i < 100000; $i++) {
    preg_replace_callback('~::([^:]+)::~U', function (array $m) use ($cisla) {
        return $cisla[$m[1]];
    }, $text);
}
echo microtime(TRUE) - $b;
Verze s callbackem je znatelně rychlejší, v PHP 5.3.6 zhruba o 30-40%.

V JavaScriptu se všechen kód zapisovaný jako řetězec bere dosti negativně
To v PHP taky, pomineme-li možná bezpečnostní rizika, špatně se to debuguje a je to hlavně brutálně pomalé:
$a = microtime(TRUE);
for ($i = 0; $i < 100000; $i++) {
    echo NULL;
}

echo microtime(TRUE) - $a;

echo '<br>';

$b = microtime(TRUE);
for ($i = 0; $i < 100000; $i++) {
    eval('echo NULL;');
}
echo microtime(TRUE) - $b;
Verze s eval je asi 12× pomalejší než bez něj (NULL je tam kvůli jednoduchosti).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0