Autor Zpráva
JackeLee
Profil *
Zdravím zdejší osazenstvo,
poslední dobou řeším jeden takový problém, mám funkce, které z textu, kterej dostanou na vstup ořežou podle levelu čtenáře ty části, které danému čtenáři nepřísluší (podle jeho levelu). Pasáže příslušící daným čtenářům jsou odděleny dvojicí tagů, kde tagy začínají a končí znakem ";".

Funkce:

function osekej_level($text)
{
define("ZNAK", ";");

$poz_pred = 0;
$poz_ted = 0;
$poz_dalsi = 0;
$result = "";


while($poz_pred = strpos($text, ZNAK, $poz_dalsi))
{
$result .= substr($text, $poz_dalsi, $poz_pred-$poz_dalsi);
$poz_ted = strpos($text, ZNAK, $poz_pred+1);
$tag = substr($text, $poz_pred+1, $poz_ted-$poz_pred-1);
$poz_dalsi = strpos($text, ZNAK.$tag.ZNAK, $poz_ted+1);

if(test_na_tag($tag))
{
$osekani = substr($text, $poz_ted+1, $poz_dalsi-$poz_ted-1);
$result .= osekej_level($osekani);
}

$poz_dalsi += 2 + strlen($tag);
}

$result .= substr($text, $poz_dalsi, strlen($text)-$poz_dalsi);
return $result;
}


function test_na_tag($text)
{
if(strlen($text)>2) return false;

$akt_level = $GLOBAL['level'];

if(strlen($text)==1)
{
if($akt_level>=$text)
{
return true;
}
else
{
return false;
}
}

switch($text[0])
{
// jen tento level
case '=': return ($akt_level==$text[1] ? true:false); break;

// bez tohoto levelu
case '-': return ($akt_level!=$text[1] ? true:false); break;

// menší než tento level
case '<': return ($akt_level<=$text[1] ? true:false); break;

// ostatní nezobrazí
default: return false;
}
}


Kde osekej_level() dostane na vstup například toto:

<p>_;2;Toto je jen pro level 2 a výše;2;
<br />
;=1;Toto je pouze pro level 1;=1;
<br />
;<3;Toto neni pro level vetsi jak 4;<3;
<br />
;-3;Neni pro level 3;-3;_a vsem</p>
<p>Pokus o zanoření: ;2;větší jak dva;3;, tři ;4;, čtyři ;=1;pro level 1, ale nemělo by se zobrazit nikomu;=1;;4;;3;;2;</p>


Nenapadá vás někoho důvod, proč jsou výše uvedené funkce příliš pomalé (jsou na jedné stránce zavolány jen několikrát = asi 1-6krát)?
Alphard
Profil
dopodrobna jsem to neprohlížel, ale funkce pro práci s řetezci, zvláště u dlouhého textu, můžou IMHO zatěžovat server
pomocí microtime() můžeš najít nejslabší místa a zkusit je nějak optimalizovat
JackeLee
Profil *
Díky za nápad, zkusím se na to podívat ;-)

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