[PHP] Gnezdenje
 
thai 19. jun 2015 17:22:28 Pridružen od:
14. dec 2014
81 objav
32 31 2
#1

Z Recursive functions sem uredil tako, da ima lahko kategorija "neomejeno" podkategorij in vsaka podkategorija še dodatne podkategorije itd. Zdaj me pa zanima ali obstaja kakšen boljši način takšnega gnezdenja kot da uporabim recursive function? Težave je, ker je na strežniku omejitev za gnezdenje, določen je "Maximum function nesting level of '100'" in ko je ta limit dosežen, se skripta ustavi. A dam limit na, ne vem, 10.000 in pozabim na vse skupaj ali obstaja kakšen boljši način?


všeč(0) ni všeč(0) spam(0)
*Uporabniku je bila prepovedana uporaba foruma zaradi večih uporabniških računov, ki so po [pravilih obnašanja](/pravila.html) prepovedani.*
 
kelvan 19. jun 2015 18:30:36 Pridružen od:
19. okt 2007
891 objav
658 122 26
#2

za začetek daj v to rekurzivno funkcijo kakšen pogoj, kdaj gre ven iz loopa, pa ne bo treba zmanjševat


všeč(0) ni všeč(0) spam(0)
 
thai 19. jun 2015 18:46:13 Pridružen od:
14. dec 2014
81 objav
32 31 2
#3

Mogoče nisem najbolj jasno napisal :) Saj koda deluje in jasno je notri tudi pogoj, da gre ven iz loopa ampak teoretično, če bi imel v bazi veliko kategorij in znotraj gnezdenih podpodpod..podkategorij, bi pač lahko prišlo do maximuma 100 in me zanima, če obstaja kakšen boljši način?



Recimo tule bi rekel, da je nesting level nad 100, če so slučajno delali z recursive function https://www.reddit.com/r/gaming/comments/3ae8qw/newdoomwitholdcolors/?limit=500



Pa saj se ne bi ne vem kako sekiral ampak zadevo, ki jo delam, bodo izpolnjevali uporabniki in potem nikol ne veš, v kakšne vse globine bodo lahko šli.


všeč(0) ni všeč(0) spam(0)
*Uporabniku je bila prepovedana uporaba foruma zaradi večih uporabniških računov, ki so po [pravilih obnašanja](/pravila.html) prepovedani.*
 
theuros 19. jun 2015 19:06:28 Pridružen od:
22. jun 2009
197 objav
120 22 1
#4

hm.. nevem kako si ti to zložil skupaj in kdo ali kaj ti določi "nesting level" ??



Glede na to da imaš neke kategorije, sklepam da uporabljaš neko bazo za te kategorije Se pravi če ima vsaka kategorija nek svoj ID in da ima poleg še parent ID ... potem ne igra nobene vloge koliko kategorij obstaja, koliko jih je pod določeno in koliko globoko gredo ? Rekurzivna funkcija ti v takem primeru služi samo za iskanje parenta X nivojev navzgor ... v globino več kot par nivojev pa ni smiselno it oz. če moraš pomeni da si slabo zastavil logiko. Verjetno ne razumem najbolje kaj sploh počneš in kje oz. kaj je ta nesting level :)


všeč(1) ni všeč(0) spam(0)
Če je nekdo profesionalec še ne pomeni da obvlada tisto kar ponuja ampak samo, da služi z svojim delom.
 
thai 20. jun 2015 08:00:13 Pridružen od:
14. dec 2014
81 objav
32 31 2
#5

theuros:

hm.. nevem kako si ti to zložil skupaj in kdo ali kaj ti določi "nesting level" ??



Glede na to da imaš neke kategorije, sklepam da uporabljaš neko bazo za te kategorije Se pravi če ima vsaka kategorija nek svoj ID in da ima poleg še parent ID ... potem ne igra nobene vloge koliko kategorij obstaja, koliko jih je pod določeno in koliko globoko gredo ? Rekurzivna funkcija ti v takem primeru služi samo za iskanje parenta X nivojev navzgor ... v globino več kot par nivojev pa ni smiselno it oz. če moraš pomeni da si slabo zastavil logiko. Verjetno ne razumem najbolje kaj sploh počneš in kje oz. kaj je ta nesting level :)




Približno tako imam, ja. Kategorija ma svoj id in parent_id. Če so samo kategorije, potem se jasno Recursive funkcija ne kliče vendar, če pa imam na primer 50 kategorij, vsaka ima še svojo podkategorijo in ta še eno podkategorijo, se pa Recursive kliče 100x in smo že pri default omejitvi in se izpiše napaka. Saj teoretično je to kar težko doseči ampak glede na to, da planiram, da bodo zadevo izpolnjevali uporabniki, nikoli ne veš, kdaj se bo našel kdo, ki bo malo "pretiraval" zato sprašujem, če obstaja kak elegantnejši način, kako nalogo rešiti, da bi se lahko izognil tej default nesting level omejitvi.


všeč(0) ni všeč(0) spam(0)
*Uporabniku je bila prepovedana uporaba foruma zaradi večih uporabniških računov, ki so po [pravilih obnašanja](/pravila.html) prepovedani.*
 
SlimDeluxe 20. jun 2015 09:11:51 Pridružen od:
29. apr 2010
1223 objav
1022 144 9
#6

Tako kot je napisal uroš, rekurzijo boš rabil samo v metodah getParent() in getChildren()... In ta tvoja omejitev bo prišla do izraza samo če bojo tvoji uporabniki vgnezdili 100 kategorij, torej bi nek menu moral imeti 100 nivojev, halo? Mislim pa da so redki ki rabijo vgnezdenje več kot 5 nivojev...

Če želiš biti programer, moraš biti pragmatičen, sicer boš zgubljal preveč časa na neumnostih


všeč(1) ni všeč(1) spam(0)
Freelance Web Developer
 
thai 20. jun 2015 09:39:52 Pridružen od:
14. dec 2014
81 objav
32 31 2
#7

Ni nujno, da ima nek meni 100 nivojev, vsaj pri moji skripti ne, če imaš 50 kategorij in ima vsak podkategorijo, se recursive kliče že 50x, ker mora za vsak podmeni pač kreirat nov meni. Sem pa omenil, da bodo rešitev uporabljali uporabniki in pri njih nikoli ne veš. Evo ti primer ene naključne strani... http://cult-trgovina.si/si/. Če imajo to rešeno z recursive, se ta kliče več kot 100x in php bi v tem primeru izpisal error (če bi ostala "default Maximum function nesting level of 100"). Tko da tale "halo?" lahko postane realnost :P


všeč(0) ni všeč(0) spam(0)
*Uporabniku je bila prepovedana uporaba foruma zaradi večih uporabniških računov, ki so po [pravilih obnašanja](/pravila.html) prepovedani.*
 
theuros 20. jun 2015 09:39:55 Pridružen od:
22. jun 2009
197 objav
120 22 1
#8

thai:

Če so samo kategorije, potem se jasno Recursive funkcija ne kliče



thai:

če pa imam na primer 50 kategorij, vsaka ima še svojo podkategorijo in ta še eno podkategorijo, se pa Recursive kliče 100x




Če so samo kategorije se recursive ne kliče, če pa so podkategorije pa se ?? .. kaj podkategorija ni kategorija ?



Prosim napiši praktičen primer kaj dejansko delaš, saj iz te razlage ni nič jasno. Kaj mogoče vsaka kategorija vsebuje X število člankov ali kakšnih izdelkov in zdaj tebe skrbi, da če bi hotel izpisati vse članke ali izdelke iz večjega števila gnezdenih kategorij, da bi se ti ta funkcija obesla oz. šla v timeout ?



Pa glede "default nesting level" ... to mi še vedno ni jasno kaj je ???? funkcija lahko gre v timeout če deluje preveč časa neglede in v tem času se lahko izvede 10x, 100x ali 1000x ..


všeč(0) ni všeč(0) spam(0)
Če je nekdo profesionalec še ne pomeni da obvlada tisto kar ponuja ampak samo, da služi z svojim delom.
 
theuros 20. jun 2015 09:44:32 Pridružen od:
22. jun 2009
197 objav
120 22 1
#9

thai:

Ni nujno, da ima nek meni 100 nivojev, vsaj pri moji skripti ne, če imaš 50 kategorij in ima vsak podkategorijo, se recursive kliče že 50x, ker mora za vsak podmeni pač kreirat nov meni. Sem pa omenil, da bodo rešitev uporabljali uporabniki in pri njih nikoli ne veš. Evo ti primer ene naključne strani... http://cult-trgovina.si/si/. Če imajo to rešeno z recursive, se ta kliče več kot 100x in php bi v tem primeru izpisal error (če bi ostala "default Maximum function nesting level of 100"). Tko da tale "halo?" lahko postane realnost :P




Očitno ti gradiš nek menu iz kategorij ki jih imaš .. ko se kreira prvi nivo greš za vsako kategorijo pogledat če ima podkategorijo in prikažeš še te .. in tako v nedogled v globino kolikor jih obstaja.



Kategorij ne sme biti toliko da bi se ti funkcija obesla .... pa če tudi .. še vedno lahko postopoma zlagaš meni in ne vsega naenkrat, ... pa tudi vse skupaj vržeš v cache tako da se ne izvede ob vsakem requestu ..



Vseh kategorij nima smisla imet na enkrat odprtih, tako da prikažeš samo aktivne in na klik izdeveš kak ajax da ti pokaže še podkategorije.


všeč(0) ni všeč(0) spam(0)
Če je nekdo profesionalec še ne pomeni da obvlada tisto kar ponuja ampak samo, da služi z svojim delom.
 
thai 20. jun 2015 09:57:31 Pridružen od:
14. dec 2014
81 objav
32 31 2
#10

theuros:




thai:

Če so samo kategorije, potem se jasno Recursive funkcija ne kliče



thai:

če pa imam na primer 50 kategorij, vsaka ima še svojo podkategorijo in ta še eno podkategorijo, se pa Recursive kliče 100x




Če so samo kategorije se recursive ne kliče, če pa so podkategorije pa se ?? .. kaj podkategorija ni kategorija ?



Prosim napiši praktičen primer kaj dejansko delaš, saj iz te razlage ni nič jasno. Kaj mogoče vsaka kategorija vsebuje X število člankov ali kakšnih izdelkov in zdaj tebe skrbi, da če bi hotel izpisati vse članke ali izdelke iz večjega števila gnezdenih kategorij, da bi se ti ta funkcija obesla oz. šla v timeout ?



Pa glede "default nesting level" ... to mi še vedno ni jasno kaj je ???? funkcija lahko gre v timeout če deluje preveč časa neglede in v tem času se lahko izvede 10x, 100x ali 1000x ..




Poženi tole kodo pa boš videl, o kakšni napaki govorim (Fatal error: Maximum function nesting level of '100' reached, aborting!)....


function count100($n) {
static $n = 1;
if ($n <= 100) {
echo $n . '<br />';
$n++;
count100($n);
}
}

count100(1);

V php.ini bi bilo potrebno povečati vrednost za xdebug.maxnestinglevel, če se ne motim.



Drugače pa moja koda generira na primer spodnje gnezdenje.





(podatki so iz večdimenzijskega polja, ki je generiran tako, da ima posamezna kategorija zapis $kategorija[$parent_id][$id] - na podlagi tega polja se potem z recursive ustvari seznam na zgornji sliki)


všeč(0) ni všeč(0) spam(0)
*Uporabniku je bila prepovedana uporaba foruma zaradi večih uporabniških računov, ki so po [pravilih obnašanja](/pravila.html) prepovedani.*
 
 

🔒 Za odgovor na to temo se moraš prijaviti.

Prijavi se