Autor Zpráva
tragi
Profil *
Zdravím,

možná to znáte, možná ne, ale občas musím udělat dlouhou podmínku, kde je hafo výrazů hafo operátorů... a tak mě napadlo si udělat zjednodušení, aby byly takovéhle podmínky čitelnější.

čili syntax vypadá nějak takto:

$e = new E();

if ($e->check('a == (b XOR c)',array(1,0,1))) {
echo 'muhehe';
}

a mám třídu E, kterou bych rád zkrátil na jedinou jednoduchou funkci, důvod proč to mám takto je, že preg_replace_callback je řádově rychlejší než obyčejný preg_replace.

Čili mě zajímá jeli cesta jak do funkce preg_replace_callback zavolat callback do kterého předám více argumentů, bez toho aniž bych musel vytvářet další pomocné funkce.
čili nějak takto: preg_replace_callback('regexp',create_function('poradte','co sem'),$expression);

třídu E mám takto:

class E {
var $vars;
function check($exp,$vars){
$this->vars = $vars;
return eval('if('.preg_replace_callback('/[a-z]/',array($this,'replace'),$exp).') return true; return false;');
}
function replace($match) {
return $this->vars[ord(strtoupper($match[0]))-65];
}
}

Prosím, jestli někdo zkušenější než já ví, zdali existuje takovéto jednoduché řešení.

Předem díky za nějakou radu, trktnutí či aspoň za váše spálené kalorie při dumání :)
Joker
Profil
tragi
mám třídu E, kterou bych rád zkrátil na jedinou jednoduchou funkci
A co brání v tom to prostě sloučit do jedné funkce?

Jinak teda upřímně řečeno nevidím to zjednodušení.
tragi
Profil *
to Joker:

za prvé mi jde spíš o to jak zavolat callback s více argumenty, za druhé, jak to jde sloučit do jedné funkce ? Mě nic nenapadá :(

co se týka zjednodušení výrazu:

potřebuji sestavit podmínku třebas ze 4 proměnných které jsou typu $someclass->someid, $fetch['column_name']...a vyskytují se v podmínce několikrát (a to sestavuji podmínky tak, že provádím minimalizaci) mno tak je pak podmínka nepřehledná a když se po nejákém čase kouknu tak musím nejdřív luštit jak je syntaxe a pak teprve můžu kouknout jestli dává smysl.

Můžu přiřadit proměnné do kratších jako třebas $a = $someclass->someid; což teda je neefektivní a nebo ten má idea

if (ec('(a == (b XOR c)) || (a != d)',array($someclass->someid,$fetch['column_name'],$othervar, $someid)))
tragi
Profil *
jinak abych tedy upřesnil a předešel nějaké debaťě, to zkrácení podmínek je jen nápad a uvidím jestli mi to něco usnadní nebo je to orpavdu blbost, rozhodně to není to na co se ptám, když tedy zapomenem na nějáke zkracování, tak vás prosím o radu nebo natrknutí, jak mám zkrátit toto do jedné funkce ?

class E {
var $vars;
function check($exp,$vars){
$this->vars = $vars;
return preg_replace_callback('/[a-z]/',array($this,'replace'),$exp);
}
function replace($match) {
return $this->vars[ord(strtoupper($match[0]))-65];
}
} 

kdybych věděl, jak to "prostě zkrátit", tak to prostě udělám a neotravuji s tím vás. Po inspiraci na php.net jsem si s tím zkoušel všemožně hrát např:

function check($exp,$vars){
	return preg_replace_callback('/[a-z]/',create_function('$match,\$vars','return $vars[ord(strtoupper($match))-65];'),$exp);
}

tak vás jen prosím, jestli může někdo aspoň napovědět jak to udělat :) nějak jinak než "prostě" :)
AM_
Profil
Proč to vlastně chceš tak nutně zkracovat do jedné funkce? Možná můžeš udělat funkci replace privátní (ale nevím to jistě, jestli na ní preg_replace uvidí, sice je použitý uvnitř třídy, ale nevím, jakým způsobem volá callback). Ale jinak nevidím smysl ani možnost udělat z toho jednu funkci.
tragi
Profil *
to AM_:
tak původně jsem se ptal jestli je to možné, a z odpovědi Jokera jsem usoudil že to možné je, jen mi to nechce říct :D
A tak něják se říká, vím že nic nevím, tak chci vědět víc, obzvlášt v oblasti programování je pořád se co učit :) Zjistil jsem že na takovéhle věci se pro samouky těžko hledá odpověď, tak jsem to zkusil tady, jestli s tím má někdo zkušenost. Jestli je vůbec možné volat přímo callback s více argumenty, nebo jestli to musím udělat přes polymorfismus (late - bindigs, tuším že se tomu tak říká).
AM_
Profil
Kvůli regulárním výrazům zavádět polymorfismus mi přijde přehnané.
Nevím o možnosti, že by callback funkci bylo možné předat více parametrů. Můžeš různě kouzlit pomocí create_function a evalu, ale tam už pochybuji o časové efektivitě. A kde jsi vlastně slyšel, že je výkonnější než preg_replace? I to mi přijde dost nepravděpodobné, možná v nějakém případě extrémně složitých výrazů, ale obecně vzhledem k interpretační povaze PHP platí, že použití vestavěných funkcí je řádově rychlejší, než vlastní kód.
Tragi
Profil *
Kvůli regulárním výrazům zavádět polymorfismus mi přijde přehnané.
mě také
Nevím o možnosti, že by callback funkci bylo možné předat více parametrů. Můžeš různě kouzlit pomocí create_function a evalu, ale tam už pochybuji o časové efektivitě. A kde jsi vlastně slyšel, že je výkonnější než preg_replace? I to mi přijde dost nepravděpodobné, možná v nějakém případě extrémně složitých výrazů, ale obecně vzhledem k interpretační povaze PHP platí, že použití vestavěných funkcí je řádově rychlejší, než vlastní kód.
Např. v mém případě je rychlejší použít preg_replace_callback nežli preg_replace s regulérním výrazem kde je použit modifikátor "e", zkus si sám a uvidíš.
př:
preg_replace('/regexp/e','user_func(\$arg...)',$string)
proti
preg_replace_callback('/regexp/','user_func',$string)

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: