Autor | Zpráva | ||
---|---|---|---|
PetraPP Profil |
#1 · Zasláno: 5. 11. 2014, 09:38:42
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 * |
#2 · Zasláno: 5. 11. 2014, 09:43:25 · Upravil/a: anonymníí
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 |
#3 · Zasláno: 5. 11. 2014, 10:20:50
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 * |
#4 · Zasláno: 5. 11. 2014, 10:25:53
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 |
#5 · Zasláno: 5. 11. 2014, 10:30:09
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 |
#7 · Zasláno: 5. 11. 2014, 10:48:57
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 * |
#10 · Zasláno: 5. 11. 2014, 10:50:22
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 |
#12 · Zasláno: 5. 11. 2014, 11:08:12
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 |
#14 · Zasláno: 5. 11. 2014, 12:08:40
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. |
||
Časová prodleva: 9 let
|
0