Více parametrů do callback funkce volané funkcí preg_replace_callback – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Více parametrů do callback funkce volané funkcí preg_replace_callback – PHP – Fórum – Programujte.comVíce parametrů do callback funkce volané funkcí preg_replace_callback – PHP – Fórum – Programujte.com

 

Míša
~ Anonymní uživatel
106 příspěvků
19. 7. 2009   #1
-
0
-

Potřeboval bych ještě radu nemůžu dojít nato jak poslat do callback funkce více parametůu při preg_replace_callback (kvůli použití v rekurzi nejde použít nějaká globální proměnná, protože by se mi přepisovala) takže bych prostě potřeboval (hodně zjednodušeně):


$Array = array();

$ID = 0;
function CallBack( $Param1, $Param2 )
{
$Array[ $Param2 ] = Present( $Param1[ 0 ] );
}
function Present( $String )
{
global $ID;
preg_replace_callback( '*****', 'CallBack', '*****' ); //$ID potřebuju poslat do CallBack jako druhý parametr
++$ID;
}


S tím že CallBack by mělo mít dva parametry, první "výsledek" z preg_replace_callback (což normálně jde) ale k tomu i druhý s určitým id procesu ale na to jak tohle udělat jsem nedošel.

Díky :smile1:

Nahlásit jako SPAM
IP: 88.102.27.–
bukaj_0010
Věrný člen
19. 7. 2009   #2
-
0
-

Míša
Podle mě jsou tři možnosti:

1) Closures[1]:

preg_replace_callback(…, function ($_) use ($ID) { return Callback($_, $ID); }, …);

Problém – funguje pouze od PHP 5.3.

2) „Funkční objekt“:


<?php
class fn
{
private $callback;
private $params;

public static function placeholder()
{
return NULL;
}

public function __construct($callback, $params = array())
{
$this->callback = $callback;
$this->params = $params;
}

public function __invoke()
{
$args = func_get_args();

$params = array();
foreach ($this->params as &$_)
if ($_ === self::placeholder()) $params[] =& array_shift($args);
else $params[] =& $_;

return call_user_func_array($this->callback, $params);
}
}

function fn($callback, $params)
{
$_ = new fn($callback, $params);
return array($_, '__invoke');
}



preg_replace_callback(…, fn('Callback', array(fn::placeholder(), $ID)), …);


Objekt třídy fn obalí callback (první argument konstruktoru) a jeho parametry (druhý). A na místo placeholderů jsou dosazeny argumenty, se kterými byl funkční objekt zavolán. Funkce fn je tu jen jako helper – od PHP 5.3 už nebude potřeba. Ale bůhví kdy se PHP 5.3 rozšíří.

3) Prostě to udělat jinak.

[1] http://php.net/closures

Nahlásit jako SPAM
IP: 88.101.128.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Míša
~ Anonymní uživatel
106 příspěvků
19. 7. 2009   #3
-
0
-

Měl jsem to původně objektově (rekurzivně se vytvářely instance), což fungovalo skvěle, vypadalo to elegantně a jednoduše, ale problém byl v rychlosti (vzhledem k velikosti projektu). Pak jsem to právě předělal podobně jako ve druhém příkladě a nakonec jsem použil jen metody jednoho objektu a tak rekurzivní instance odpadly a tak jsem musel nějakým způsobem odlišit od sebe prováděné rekurzivní nahrazování přes preg_replace_callback.

Nakonec jsem ale došel na to že stačí s na začátku callback funkce zapamatovat "id" operace které bude v nějaké proměnné objektu a na konci to id hodit zpátky do proměnné objektu. Vzhledem k tomu že to rekurzivní volání probíhá právě ve funkci callback tak se při rekurzi změní id ale jakmile se z rekurze vrátí tak se id "obnoví". Tohle sice zapříčiní že jakmile zkončí určitá operace s určitým id tak se to id použije znova v ralší rekurzi (protože se obnoví a následně zase přičítá) ale to už není problém.

Díky za rady :smile1:

Nahlásit jako SPAM
IP: 88.102.27.–
hrach
~ Redaktor
+1
Boss
19. 7. 2009   #4
-
0
-

To bukaj_001 : není náhodou invoke také případ až php 5.3? :) já mám takový dobrý pocit že ano.

Nahlásit jako SPAM
IP: 90.179.27.–
http://jan.skrasek.com@hrachcz – webdeveloper
bukaj_0010
Věrný člen
19. 7. 2009   #5
-
0
-

hrach
není náhodou invoke také případ až php 5.3? :) já mám takový dobrý pocit že ano.
Správně. Proto je tam taky ten helper fn(), který vytvoří instanci a vrátí callback na instanční __invoke():

function fn($callback, $params)

{
$_ = new fn($callback, $params);
return array($_, '__invoke');
}

Nahlásit jako SPAM
IP: 88.101.128.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
hrach
~ Redaktor
+1
Boss
20. 7. 2009   #6
-
0
-

To bukaj_001 : tož to je opravdu zajímavé, sem to jaksi přehlédl, díky za pěkný příklad :)

Nahlásit jako SPAM
IP: 90.179.27.–
http://jan.skrasek.com@hrachcz – webdeveloper
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 21 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý