Autor | Zpráva | ||
---|---|---|---|
tragi Profil * |
#1 · Zasláno: 17. 3. 2009, 16:18:57
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 |
#2 · Zasláno: 17. 3. 2009, 16:43:49
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 * |
#3 · Zasláno: 17. 3. 2009, 17:08:13
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 |
#5 · Zasláno: 17. 3. 2009, 18:48:32
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 * |
#6 · Zasláno: 17. 3. 2009, 18:59:23
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 |
#7 · Zasláno: 17. 3. 2009, 20:42:16
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 * |
#8 · Zasláno: 18. 3. 2009, 01:11:53
„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) |
||
Časová prodleva: 15 let
|
0