Autor Zpráva
PetraPP
Profil
Potřebovala bych za pomocí FOR cyklu vytvořit slovo %kategorie_1234%, ale co jsem sama vytvořila, tak nefunguje. Str_replace můj příkaz na přepsání textu neprovede :(

for ($m = 0; $i <= 12; $i++) {
$menu = str_replace("%kategorie_$m%", "", $menu);
}
anonymníí
Profil *
PetraPP:
for ($i = 0; $i <= 12; $i++) {
    $menu = str_replace("%kategorie_$i%", "", $menu);
}



Ještě doplním, že tímto cyklem nikdy nevytvoříš %kategorie_1234%, ale postupně
%kategorie_1%
%kategorie_2%
%kategorie_3%
...
PetraPP
Profil
Mockrát děkuji.
Jde o to, že chci nahradit vždy jeden nebo dva %kategorie_1234% za class="active" a zbytek potřebuji smazat. Počet položek je tak v cyklu 100. Myslíte, že je dobrý nápad cyklovat a zbytek mazat přes str_replace? Ptám se, zda-li existuje i rychlejší způsob smazání zbytků.
anonymníí
Profil *
PetraPP:
Při počtu 100 průchodu jednorázově je to jedno, čas je téměř nulový.

Ale ty hledáš aktivní stránku, tzn. provádíš ten cyklus pro každou stránku a každého návštěvníka. To je opravdu zbytečné, zkus to udělat jinak.

Čemu vadí tenhle string? Cyklus už jednou procházíš - když vypisuješ položky menu, tak si do něj přidej podmínku, jestli se jedná o aktivní stránku a pokud ano, rovnou ji jako aktivní označ.
juriad
Profil
PetraPP:
Myslím, že nikdo nechápe, o co se snažíš. Zkus popsat svůj problém šířeji.
Vypadá to na nějaké menu. Ale v menu nechceš obvykle mazat třídu, chceš naopak někde mít těch tříd víc najednou. Také mi v takovém případě není jasné, proč každá položka musí mít svoji vlastní třidu. Nestačí ji nastavit některému parentovi?
PetraPP
Profil
Menu je obsáhlé (kategorie, podkategorie) + počítání počet položek. Script zpracovává menu i 15 sekund. Proto menu zpracovávám zvlášť do souboru a 1x za den přes CRON aktualizuji. Abych mohla v menu označovat kategorie a podkategorie, tak do souboru pro menu ukládám identifikátory %kategorie_1234% a %podkategorie_1234%. Číslo 1234 berte pouze jako příklad.

Následně jakmile příjde uživatel na web stránku, tak data ze souboru načtu do stringu přes file_get_contents a za pomocí cyklování 0 -> 100 (později jich může být až 250) provádím u vybrané kategorie přepis přes str_replace. Zbytek se v cyklu přes str_replace maže.

Cyklus však jede při každé návštěvě. Bohužel ale cachovat menu zvlášť kvůli class="active" u kategorie či podkategorie by nešlo. To bych cachovala snad 250x. Proto jsem zvolila tuto možnost.

Jen mám obavy o pomalost, když musím zbytečně mazat i ostatní str_replace. Ani bych to nemusela cyklovat, protože %kategorie_1234% číslo 1234 znám, které chci označit = je to ID kategorie či podkategorie.

Mazání zbytků ... co na to použít regulérní výraz? Že by smazal vše, co je mezi %...% ?
tiso
Profil
PetraPP: nič ti nebráni miesto cache menu si cachovať pole, z ktorého si potom to menu vieš vyskladať a doplniť triedu "active" kam treba.
juriad
Profil
PetraPP:
Řekl bych, že spíš bude výkonostní chyba ve skriptu generující menu. Většinou bývá chybou dotabázový dotaz v cyklu.

Takže ty máš menu, které má 100 hlavních položek a každá z nich obsahuje ještě další? Jak velký je ten soubor s předgenerovaným menu? Uvědomuješ si, že ho celý posíláš každému klientovi? Nešlo by to řešit lépe, třeba nabízet jen jednu úroveň a aktuální okolí a při prvním náznaku o zájem o zbytek by se AJAXem dotáhlo celé? Pokud by AJAX selhal, došlo by k normálním synchronnímu requestu.

Nechceš raději ukázat ten skript než řešit důsledky? Možná zjistíme, že opravdu lepší řešení není, ale pravděpodobně najdeme nějakou botu.
PetraPP
Profil
+ se vypočítává počet položek. V mySQL těch položek je téměř 50 tisíc. I proto scriptu to trvá déle. MENU a SQL je navrhnuté velmi dobře. Problém je jen v co nejefektivnějším označování kategorie a podkategorie. Pokud člověk si načte kategorii, potřebuji tuto kategorii v menu označit. A proto str_replace(), který nahradí %kategorie_5% za class="active" a zbytek %kategorie_CISLO% přes FOR cykl smaže.
anonymníí
Profil *
PetraPP:
Script zpracovává menu i 15 sekund
Hm, zajímavé. Nebylo by lépe zaměřit se na to, proč to trvá tak dlouho?

a za pomocí cyklování 0 -> 100 (později jich může být až 250) provádím u vybrané kategorie přepis přes str_replace. Zbytek se v cyklu přes str_replace maže.
Tohle je divné. Čemu ty třídy vadí, když už tam jsou?

Jen mám obavy o pomalost, když musím zbytečně mazat i ostatní str_replace. Ani bych to nemusela cyklovat, protože %kategorie_1234% číslo 1234 znám, které chci označit = je to ID kategorie či podkategorie.
A já mám obavy o správný návrh aplikace. Menu o 250 položkách přeci není nic hrozného, co by mělo trvat více několik milisekund při renderu.
PetraPP
Profil
Příklad výpisu jedne kategorie + její podkategorie:
<li class="box%kategorie_1% sub"><a href="/zbozi/">Zboží<i>12174</i></a> <span>></span>
<ul>
<li%podkategorie_7%><a href="/zbozi/boty-a-obuv/">Boty a obuv<i>1839</i></a></li>
<li%podkategorie_8%><a href="/zbozi/domacnost/">Domácnost<i>1715</i></a></li>
<li%podkategorie_12%><a href="/zbozi/gadgets-a-originalni-darky/">Gadgets<i>8</i></a></li>
<li%podkategorie_19%><a href="/zbozi/sperky-a-bizuterie/">Šperky a bižuterie<i>123</i></a></li>
<li%podkategorie_27%><a href="/zbozi/tapety-a-samolepky/">Tapety a samolepky<i>405</i></a></li>
<li%podkategorie_33%><a href="/zbozi/pocitace-a-dalsi-zarizeni/">Počítače a další zařízení<i>450</i></a></li>
<li%podkategorie_41%><a href="/zbozi/elektronicke-cigarety/">Elektronické cigarety<i>32</i></a></li>
<li%podkategorie_85%><a href="/zbozi/parfemy/">Parfémy<i>12</i></a></li>
<li%podkategorie_86%><a href="/zbozi/hracky/">Hračky<i>66</i></a></li>
<li%podkategorie_22%><a href="/zbozi/jizdni-kola/">Jízdní kola<i>0</i></a></li>
<li%podkategorie_1_0%><a href="/zbozi/ostatni/">Ostatní<i>4849</i></a></li>
</ul>
</li>

Kategorii a podkategorii je aktuálně okolo 100, ale budu přidávat další, tak že se dotanu i k 250. Počet samotných položek, které se kategorizují, tak těch je téměř 50 tisíc. I proto to scriptu trvá déle. Kdyby tam bylo pár položek, tak to nebudu řešit ;)

Jde mě hlavně o to, že když už vstoupím do podkategorie, tak v menu ji potřebuji označit a zbytek elementů %....% smazat.
juriad
Profil
PetraPP:
Raději ukaž skript, který je generuje.

Mimochodem, pokud bys tu šílenost %podkategorie_#% nahradila třeba za id="podkategorie_#", tak to vyjde na stejno a můžeš to tam nechat. str_replace bude fungovat také a bude stačit to nahradit jen na jednom místě.
str_replace('id="podkategorie_22"', 'id="podkategorie_22" class="active"');
PetraPP
Profil
juriad:
Díky moc. Tato možnost mě nenapadla. Předtím se stránka zpracovávala s tím cyklováním 0.55 milisekund. Nyní při tvém použití se stránka načte za nějakých 0.42 - 0.50, což je kladný posun.
juriad
Profil
PetraPP:
Hm, méně než milisekunda.

To však neznamená, že generování menu by nešlo zrychlit. Klidně pokračuj v tomto vlákně, máš-li zájem.

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: