Avatar billede cyberjelle Nybegynder
14. august 2006 - 21:48 Der 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);
}

Fra databasen hentes følgende:

|id| - |cat| - |subcat_to|

|11| - |beklædning| - |0|
|12| - |mc| - |0|
|14| - |speciel| - |18|
|18| - |trøjer| - |11|
|19| - |bukser| - |11|

Hvis motivet ikke giver sig selv, må i lige sige til.
Avatar billede nielle Nybegynder
14. august 2006 - 21:54 #1
Start med at rette:

if ($sub_keys = array_keys($all_cats,$id)) {

- til:

if ($sub_keys == array_keys($all_cats,$id)) {
Avatar billede Slettet bruger
14. august 2006 - 21:57 #2
$sub_cats[0] = $cat_id;

Det virker ikke umiddelbart smart i en rekursiv funktion at overskrive med en fast nøgle. Hvad er grunden til dette?
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:03 #3
-> nielle: Jeg vil ikke tjekke om de er ens, men om array_keys returnerer noget

-> wicez: Jeg forstår godt hvad du mener, men hvordan skal jeg ellers bevare id'et for kategorien?
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:07 #4
Jeg havde forestillet mig flg resultat
print_r($cat_tree);

Udskriver:

[0] => Rod
[1] => Array
    (
    [0] => 11
    [1] => Array
        (
        [0] => 18
        [1] => 14
        )
    [2] => 19
[2] = 12
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:08 #5
Manglede lige en parentes:
[0] => Rod
[1] => Array
    (
    [0] => 11
    [1] => Array
        (
        [0] => 18
        [1] => 14
        )
    [2] => 19
    )
[2] = 12
Avatar billede nielle Nybegynder
14. august 2006 - 22:14 #6
I såfald bør dit tjek se sådan her ud:

$sub_keys = array_keys($all_cats,$id)
if ($sub_keys !== false) {
Avatar billede Slettet bruger
14. august 2006 - 22:17 #7
foreach ($sub_keys as $sub_id) {
            $sub_cats[$cat_id][] = getsubcatsdeep($all_cats,$sub_id);
        }

I stedet for

$sub_cats[0] = $cat_id;
        foreach ($sub_keys as $sub_id) {
            $sub_cats[] = getsubcatsdeep($all_cats,$sub_id);
        }

Ville jeg gøre
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:18 #8
Jeg kan ikke umiddelbart se nogen stor forskel mellem de to følgende linier:

1. while ($sql_array = mysql_fetch_array($sql)) {

2. if ($sub_keys = array_keys($all_cats,$id)) {

Så hvorfor mener du lige at linie 2 skal omskrives?
Avatar billede nielle Nybegynder
14. august 2006 - 22:23 #9
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.
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:31 #10
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 :)
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:35 #11
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
Avatar billede nielle Nybegynder
14. august 2006 - 22:37 #12
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.
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:51 #13
Jeg regner med at du mente $root_cats i stedet for $subcats_to :)
Men her er de - alle som forventet:
Array
(
    [11] => 0
    [12] => 0
    [14] => 18
    [18] => 11
    [19] => 11
)
ass_cats:
Array
(
    [11] => Array
        (
            [0] => 11
            [id] => 11
            [1] => Beklædning
            [cat] => Beklædning
            [2] => 0
            [subcat_to] => 0
        )

    [12] => Array
        (
            [0] => 12
            [id] => 12
            [1] => Motorcykler
            [cat] => Motorcykler
            [2] => 0
            [subcat_to] => 0
        )

    [14] => Array
        (
            [0] => 14
            [id] => 14
            [1] => speciel
            [cat] => speciel
            [2] => 18
            [subcat_to] => 18
        )

    [18] => Array
        (
            [0] => 18
            [id] => 18
            [1] => trøjer
            [cat] => trøjer
            [2] => 11
            [subcat_to] => 11
        )

    [19] => Array
        (
            [0] => 19
            [id] => 19
            [1] => bukser
            [cat] => bukser
            [2] => 11
            [subcat_to] => 11
        )

)
root_cats:
Array
(
    [11] => 0
    [12] => 0
)
Avatar billede cyberjelle Nybegynder
14. august 2006 - 22:51 #14
Den øverste var $ass_tree!
sorry
Avatar billede cyberjelle Nybegynder
14. august 2006 - 23:25 #15
Jeg kan informere om, at selv hvis funktionen laves om til følgende stoppes scriptet:

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;
}

...Men hvis funktionen ikke køres forløber scriptet fint.
???
Avatar billede cyberjelle Nybegynder
14. august 2006 - 23:30 #16
Så det er vidst ikke som først antaget en evighedsløkke
Avatar billede nielle Nybegynder
14. august 2006 - 23:35 #17
Jeg kigger på det i morgen :^)

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;
}
Avatar billede cyberjelle Nybegynder
14. august 2006 - 23:38 #18
Det jeg var inde på er jo netop, at det stadig ikke virkede, selvom jeg udkommenterede linierne.
Avatar billede nielle Nybegynder
14. august 2006 - 23:40 #19
Undskyld, læste åbenbart ikke grundigt nok hvad du skrev. :^|
Avatar billede cyberjelle Nybegynder
14. august 2006 - 23:41 #20
Det er da helt ok... Er selv ved at være lidt træt :)
Avatar billede cyberjelle Nybegynder
14. august 2006 - 23:50 #21
Men tak for opmærksomheden indtil videre!
Avatar billede nielle Nybegynder
15. august 2006 - 12:21 #22
Skal din funktion ikke snare se sådan her ud?

function getsubcatsdeep($all_cats, $id) {
    if ($sub_keys = array_keys($all_cats, $id)) {
        $sub_cats[0] = $id;
        foreach ($sub_keys as $sub_id) {
            $sub_cats[] = getsubcatsdeep($all_cats, $sub_id);
        }
        return $sub_cats;
    } else
        return $id;
}
Avatar billede cyberjelle Nybegynder
15. august 2006 - 14:21 #23
Jo.... variablen $id hed fra starten $cat_id. Havde åbenbart ikke ømdøbt det hele. Men det er stadig ikke problemet.
Avatar billede nielle Nybegynder
15. august 2006 - 17:24 #24
Det går også i spin hvis du udkommentere dette?

function getsubcatsdeep($all_cats, $id) {
    if ($sub_keys = array_keys($all_cats, $id)) {
        $sub_cats[0] = $id;
        //foreach ($sub_keys as $sub_id) {
        //    $sub_cats[] = getsubcatsdeep($all_cats, $sub_id);
        //}
        return $sub_cats;
    } else
        return $id;
}

Hvis det er tilfældet, hvad sker der så hvid ud udkommentere her?

$cat_tree[0] = 'rod';
foreach($root_cats as $cat_id => $value) {
    // $cat_tree[] = getsubcatsdeep($ass_tree,$cat_id);
}
Avatar billede cyberjelle Nybegynder
15. august 2006 - 18:08 #25
Hehe... Nej, så køres scriptet fint.
Følgende fucker også op.

function getsubcatsdeep($all_cats, $id) {
    $sub_keys = array_keys($all_cats, $id);
    #if (!$sub_keys) {
    #    $sub_cats[0] = $cat_id;
    #    foreach ($sub_keys as $sub_id) {
    #        $sub_cats[] = getsubcatsdeep($all_cats,$sub_id);
    #    }
    #    return 'ko';//$sub_cats;
    #} else
    return $id;
}

Altså må det jo være følgende linie:
$sub_keys = array_keys($all_cats, $id);

Men hvad der er galt fatter jeg virkelig ikke.
Avatar billede nielle Nybegynder
15. august 2006 - 18:25 #26
Ser der det samme hvis du ændre:

cat_tree[0] = 'rod';
foreach($root_cats as $cat_id => $value) {
    // $cat_tree[] = getsubcatsdeep($ass_tree,$cat_id);
}

- til:

cat_tree[0] = 'rod';
foreach($root_cats as $cat_id => $value) {
    $sub_keys = array_keys($ass_tree,$cat_id);
}

?
Avatar billede cyberjelle Nybegynder
15. august 2006 - 19:41 #27
virker fint
Avatar billede nielle Nybegynder
15. august 2006 - 19:57 #28
Sjovt, for det er ellers den samme kode som bliver udført i begge tilfælde. :^|
Avatar billede cyberjelle Nybegynder
15. august 2006 - 21:31 #29
Ja... Det er fucked up... Men jeg lover dig... Jeg har virkelig dobbelt tjekket flere gange... Der ER en forskel.
Avatar billede cyberjelle Nybegynder
15. august 2006 - 22:21 #30
Det her driver mig virkelig til vanvid. Er der ikke en, der gider prøve på en anden server?
Avatar billede cyberjelle Nybegynder
15. august 2006 - 22:38 #31
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??
Avatar billede cyberjelle Nybegynder
15. august 2006 - 22:45 #32
Jeg vil lige skynde mig at sige, at funktionen faktisk returnerer præcist det ønskede:
function getsubcatsdeep($all_cats, $id) {
    if ($sub_keys = array_keys($all_cats, $id)) {
        $sub_cats[0] = $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);
}
-------
Returnerer:
-------
Array
(
    [0] => rod
    [1] => Array
        (
            [0] => 11
            [1] => Array
                (
                    [0] => 18
                    [1] => 14
                )

            [2] => 19
        )

    [2] => 12
)
Avatar billede cyberjelle Nybegynder
15. august 2006 - 22:47 #33
Men hvorfor hulen virker det ikke fra den "store" fil????
Avatar billede cyberjelle Nybegynder
15. august 2006 - 22:51 #34
Hehe... Da jeg flyttede funktionen til filen, med nogle af de andre funktioner, virker det også pludselig fra den før omtalte "store" fil.
Avatar billede nielle Nybegynder
15. august 2006 - 22:51 #35
Måske virker dette bedre:

function getsubcatsdeep($all_cats, $id) {
    if ($sub_keys = array_keys($all_cats, $id)) {
        $sub_cats = array();
        $sub_cats[0] = $id;
        foreach ($sub_keys as $sub_id) {
            $sub_cats[] = getsubcatsdeep($all_cats,$sub_id);
        }
        return $sub_cats;
    } else return $id;
}
Avatar billede cyberjelle Nybegynder
15. august 2006 - 22:53 #36
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 :)
Avatar billede nielle Nybegynder
15. august 2006 - 23:01 #37
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 :^)
Avatar billede Slettet bruger
16. august 2006 - 07:05 #38
Jeg har vist ikke fortjent nogen points i denne sammenhæng ;o) Ellers tak.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester