14. august 2006 - 21:48Der er
36 kommentarer og 2 løsninger
nonstop loop
Følgende script kører i evighed, og jeg kan virkelig ikke finde ud af hvorfor. Håber i kan hjælpe. $sql = mysql_query("SELECT id, cat, subcat_to FROM cms_products_cats"); while ($sql_array = mysql_fetch_array($sql)) { $ass_tree[$sql_array['id']] = $sql_array['subcat_to']; $ass_cats[$sql_array['id']] = $sql_array; } foreach($ass_tree as $cat_id => $subcat_to) { if ($subcat_to == '0') $root_cats[$cat_id] = $subcat_to; }
function getsubcatsdeep($all_cats,$id) { if ($sub_keys = array_keys($all_cats,$id)) { $sub_cats[0] = $cat_id; foreach ($sub_keys as $sub_id) { $sub_cats[] = getsubcatsdeep($all_cats,$sub_id); } return $sub_cats; } else return $id; } $cat_tree[0] = 'rod'; foreach($root_cats as $cat_id => $value) { $cat_tree[] = getsubcatsdeep($ass_tree,$cat_id); }
Hvis det er mig du spørger, så kan jeg ikke lige se hvad din linje 1. reference går ud på?
Mht. mit råd om at erstatte:
if ($sub_keys = array_keys($all_cats,$id)) {
- med:
$sub_keys = array_keys($all_cats,$id); if ($sub_keys !== false) {
- så er pointen at PHP sagtens kan finde ud af at fortolke ting som true og false selv om de er noget helt andet - f.eks. tallene 0 og 1. Med sammenligningsoperatoren !== sikre man sig imidlertid imod at noget "ser ud til at være" false (f.eks. 1), men ikke er det i virkeligheden.
Det er jeg skam med på, og jeg er ganske enig, i de tilfælde hvor man rent faktisk kan forvente en string eller integer return,. Men det er bare ikke lige tilfældet her. Her returneres enten et array eller null, så det har i virkeligheden ikke nogen betydning her. Jeg sætter virkelig pris på jeres hjælp, men de småting i nævner er ikke årsagen til at scriptet loop'er lige lovligt meget :)
Faktisk skal det måske lige siges, at jeg rent faktisk ikke ved 100% at scriptet looper i evighed. Men scriptet bliver i hvert fald stoppet på serveren
Det er vel kun naturligt at vi kaster os over de mest iøjenfaldende ting først. ;^)
Man, kan du ikke lige starte med at udskrive de tre grundlæggede arrays, $ass_tree, $ass_cats og $subcat_to, ser de ud som du ville forvente det? Post dem lige her sådan at vi også kan følge med.
Men, jo det er helt sikkert en evighedsløkke. Ved at udkommentere de 4 linjer fjerner du jo netop det rekursive, og så går den glat igennem. Det er helt sikker også nok at fjerne selve kaldet:
function getsubcatsdeep($all_cats,$id) { if ($sub_keys = array_keys($all_cats,$id)) { $sub_cats[0] = $cat_id; foreach ($sub_keys as $sub_id) { // $sub_cats[] = getsubcatsdeep($all_cats,$sub_id); } return $sub_cats; } else return $id; }
Dette script er i virkeligheden et udpluk af et større script på 1200+ linier. Jeg prøvede at køre dette script alene, og nu virker det - eller det bliver i hvert fald kørt i den fulde udstrækning. Resultat afviger en anelse fra det ønskede, men det retter jeg i morgen. Er der nogen, der har en forklaring??
Jeg er stadig interesseret i en forklaring, hvis der skulle være en der sidder inde med den. Læg et svar i to, så deler vi alle tre. I har trods alt forsøgt godt og grundigt :)
Mit bud er at et eller andet i getsubcatsdeep() ødelækker noget for noget længere nede. Jeg kunne f.eks. foreestille mig at det er $sub_cats som bliver mishandlet når du bare uden vider smider ind på 0' plads. Det er derfor at jeg foreslår at du startere med at initialisere den med:
$sub_cats = array();
Jeg ved dog ikke om det er det, men jeg har på den anden side ikke noget bedre bud.
... og et svar :^)
Synes godt om
Slettet bruger
16. august 2006 - 07:05#38
Jeg har vist ikke fortjent nogen points i denne sammenhæng ;o) Ellers tak.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.