[PHP] Returnen werkt niet?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Ik ben bezig met een scriptje voor navigatie. Dit kan makkelijker dan onderstaand, maar het moet deel uit gaan maken van een grotere site, waarbij het _wel_ zo in elkaar moet steken (althans dat is het makkelijkst).

De onderstaande code is wat ik nu aan het testen ben op de array die bovenin staat. Het geval wil dat ik, op het moment dat ik de array wil returnen, hiervan een print_r kan geven. Ik krijg dan de correcte output, precies de array die ook gereturned moet worden.

Als ik vervolgens een echo van $array doe _na_ de return (dus na de aanroep van de functie een echo van de variabele waaraan in de return heb gehangen), krijg ik helemaal niets nakkes nada noppes. Het lijkt erop alsof alles gewoon 'weg' is...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Array navigatie
$navigatie = array( 0, array    (0, array(0,1,2),
                                         1, array(0,1,2)
                                        ),
                            1, array    (0, array(0,1,2),
                                         1, array(0,1,2),
                                         2, array(0,1,2)
                                        ),
                        );

//Functie voor het ophalen van items
function getItems($hoofd_id, $array)
{
    function    searchHoofd($i, $hoofd_id, $array)
    {
        if($i == 0){ return; }
        if($i == $hoofd_id){ return $array[($i*2)-1]; } //hier kan ik print_r
        searchHoofd($i-1, $hoofd_id, $array);
    }
    $array = searchHoofd(sizeof($array)-1, $hoofd_id, $array);
    return $array; //hier een print_r levert niets op
}
$resultaat = getItems('2', $navigatie);

//Output opgehaalde items
echo "<pre>";
print_r($resultaat); //...en dus automatisch deze ook niet
echo "</pre>";

[ Voor 3% gewijzigd door Kaastosti op 25-04-2003 10:04 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Bij een return wordt de functie 'afgesloten'. Alle commando's na ee return worden dus niet uitgevoerd..

[edit]
Verder vind ik de constructie van een functie in een functie een beetje vreemd.. wat heeft het voor voordeel om het zo te doen?

[ Voor 45% gewijzigd door thomaske op 25-04-2003 10:11 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 12-09 09:30
Waarom zet je 2 functies in elkaar ?

probeer die 2e functie eens uit de eerste te halen ?

edit:
whoops, fout gekeken :D

[ Voor 73% gewijzigd door BRAINLESS01 op 25-04-2003 10:12 ]


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
De functie wordt inderdaad afgeloten, maar er is na die return ook niets meer. De functie is klaar en de waarde die gereturned wordt zou naar mijn weten in $array moeten zitten hierna.

Er is geen benodigde derde argument. Eerst komt de definitie van de functie, waarna deze aangeroepen wordt met het eerste argument sizeof($array)-1. Dit zit dus wel ok in elkaar... ik krijg ook geen foutmeldingen van de parser, alleen geen output :)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik vermoed dat deze op een gegeven moment uitgevoerd wordt:

PHP:
1
if($i == 0){ return; }


waarna de $array opeens niets meer is.

En volgens mij kan je deze constructie ook zonder recursie oplossen; een stuk geheugenvriendelijker, leesbaarder en voorkomt dat je webserver crashed op het moment dat je recursielevel te diep gaat (en dat is bij PHP onder IIS al vrij snel).

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Je recursie werkt niet helemaal goed..

verander
PHP:
18
searchHoofd($i-1, $hoofd_id, $array);


eens in

PHP:
18
return searchHoofd($i-1, $hoofd_id, $array);

[ Voor 3% gewijzigd door thomaske op 25-04-2003 10:18 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Nee, die wordt alleen uitgevoerd als if($i == $hoofd_id) niet wordt gevonden. Tot die tijd wordt deze overgeslagen. Dit kan inderdaad ook zonder recursie, maar het moet nog een paar leveltjes dieper worden, waarbij recursie nu juist _de_ oplossing is. Het draait lokaal hier onder apache + php... Het recursielevel zal nooit te diep gaan, aangezien de maximale diepte automatisch de grootte van de array is (en die is nooit erg groot).

Als ik direkt een return doe van searchHoofd() is de functie afgelopen. Hij moet juist die functie met $i-1 aan blijven roepen totdat $i == $hoofd_id en dan de bijbehorende array returnen.

Dit systeem heeft gewerkt, maar dan met iets andere variabelen... de manier van recursie klopt dus wel redelijk.

[ Voor 45% gewijzigd door Kaastosti op 25-04-2003 10:22 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Kaastosti schreef op 25 april 2003 @ 10:18:
Als ik direkt een return doe van searchHoofd() is de functie afgelopen. Hij moet juist die functie met $i-1 aan blijven roepen totdat $i == $hoofd_id en dan de bijbehorende array returnen.

Dit systeem heeft gewerkt, maar dan met iets andere variabelen... de manier van recursie klopt dus wel redelijk.
Heb je het al geprobeerd?

In een recursieve functie moet je *altijd* wat returnen, anders raak je gegevens (oid) 'kwijt' (dat is nu dus het geval)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Hij wil ook wel, aangezien ik, als ik een echo doe van de te returnen array binnen die if, voordat ie 'm daadwerkelijk returned, gewoon output krijg.

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ja, dat doet ie ook 1 keer, maar vervolgens wordt er met het resultaat van die funtie niks gedaan omdat de functie waarin deze aangeroepen werd het zelf niet meer terug geeft. Zet nu gewoon eens return ervoor en kijk wat ie doet :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
kan ernaast zitten maar searchHoofd returned dus helemaal niets, dan is het niet vreemd dat de array in getItems leeg is....

Doe eens wat Janoz zegt, weet bijna zeker dat het dan opgelost is..

Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Dus op deze manier?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function getItems($hoofd_id, $array)
{
    function    searchHoofd($i, $hoofd_id, $array)
    {
        if($i == 0){ return; }
        if($i == $hoofd_id){ return $array[($i*2)-1]; }
        return searchHoofd($i-1, $hoofd_id, $array);
    }
    $array = searchHoofd(sizeof($array)-1, $hoofd_id, $array);
    return $array;
}
$resultaat = getItems('2', $navigatie);


Dan krijg ik niets

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
$i==$hoofd_id gaat in ieder geval nooit matchen omdat je $hoofd_id een string is en $i een int....

Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Die wordt wel gematched. Als ik dit doe:
PHP:
1
2
3
4
5
6
if($i == $hoofd_id){
   echo"<pre>";
   print_r($array[($i*2)-1]);
   echo"</pre>;
   return $array[($i*2)-1];
} 

Dan krijg ik netjes de goede array op het scherm. Dat is dus ook de array die daarna gereturned wordt. Ik ging er eigenlijk van uit dat deze array dan in $array werd gestopt buiten de functie, waarna $array zelf word gereturned vanuit de parent-functie. Als is voor deze laatste return een print_r doe, is de info echter al weg.

[ Voor 7% gewijzigd door Kaastosti op 25-04-2003 11:54 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

regel 20 en 21:

PHP:
1
2
 $returnarray = searchHoofd(sizeof($array)-1, $hoofd_id, $array); 
return $returnarray;


Altijd uitkijken met je var-namen! :P

Sundown Circus


Acties:
  • 0 Henk 'm!

  • AdLentis
  • Registratie: Mei 2000
  • Laatst online: 17-09 11:54

AdLentis

Gadget Inspector

RedRose schreef op 25 April 2003 @ 12:27:
regel 20 en 21:

PHP:
1
2
 $returnarray = searchHoofd(sizeof($array)-1, $hoofd_id, $array); 
return $returnarray;


Altijd uitkijken met je var-namen! :P
Juist!

Ter aanvulling/verduidelijking: searchHoofd en getItems gebruiken allebei naam $array in hun parameters, terwijl het toch wel degelijk om verschillende variabelen gaat (ander recursielevel). Dat is gevaarlijk. En dat gaat hier waarschijnlijk ook fout. ;)

Ik ben tenminste niet altijd hypocriet!


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Nee hoor, de array die in getItems bekend is wordt als argument doorgegeven aan searchHoofd. Dat deze laatste functie hier lekker z'n recursieve gang mee gaat maakt niet meer uit, aangezien getItems verder niets meer met deze array doet.

Dat die var-namen gelijk zijn is met opzet gedaan en is niet het probleem. Ook als ik deze wijzig (want ik vermoedde hetzelfde als jullie nu doen) in iets origineels blijft het scherm leeg.

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Wanneer ik jouw bovenste stuk code pak, en alleen regel 18 wijzig (return erbij, zoals ik hierboven heb aangegeven) krijg ik:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Array
(
    [0] => 0
    [1] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
        )

    [2] => 1
    [3] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
        )

    [4] => 2
    [5] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
        )

)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

thomaske schreef op 25 april 2003 @ 13:15:
Wanneer ik jouw bovenste stuk code pak, en alleen regel 18 wijzig (return erbij, zoals ik hierboven heb aangegeven) krijg ik:
Inderdaad, ik had het met de volgende code getest:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?
//Array navigatie 
$navigatie = array(    0, array    (0, array(0,1,2), 
                                         1, array(0,1,2) 
                                        ), 
                            1, array    (0, array(0,1,2), 
                                         1, array(0,1,2), 
                                         2, array(0,1,2) 
                                        ), 
                        ); 

    echo "<pre> Navigatie:";
    print_r($navigatie);
    
//Functie voor het ophalen van items 
function getItems($hoofd_id, $array) 
{ 
    function searchHoofd($i, $hoofd_id, $array) 
    { 
        echo ($i."<br>");
        echo ($hoofd_id."<--hoofd<br>");

        if($i == 0)
        { 
            echo "mooh";
        } 
        
        if($i == $hoofd_id)
        {
            echo ("formula=".(($i*2)-1)."<br>");
            print_r($array[(($i*2)-1)]);
            echo "end in searchHoofd";
            return $array[(($i*2)-1)];
        }
        else
        {
        //hier kan ik print_r 
        searchHoofd($i-1, $hoofd_id, $array);
        return $array;
        }
    } 

    $returnarray = searchHoofd(sizeof($array)-1, $hoofd_id, $array); 
    echo "<br/>RETURN:<br/>";
    print_r($returnarray);
    
    return $returnarray; //hier een print_r levert niets op 

}

$resultaat = getItems('2', $navigatie); 

//Output opgehaalde items 
echo "resultaat:<br>";
print_r($resultaat); //...en dus automatisch deze ook niet 
echo "</pre>";
?>
.edit: Je MOET de return variabele in searchHoofd een ander naampje geven en ik was er vergeten bij te melden dat ook ik (regel 39) een return had gezet. :P

[ Voor 11% gewijzigd door RedRose op 25-04-2003 13:25 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Hmmmz owkee :) Dan doen we het zo !
Bedankt voor de hulp :D

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Kaastosti schreef op 25 April 2003 @ 13:25:
Hmmmz owkee :) Dan doen we het zo !
Bedankt voor de hulp :D
Riiight. :/ .edit: Eigenlijk zou ik je moeten vragen om 2 A4-tjes met een uitleg waarom het nu wel werkt en wat je gaat doen om dit soort onbenullige dingen in de toekomst te voorkomen. Dus: probeer om in ieder geval je eigen code te snappen. ;)

[ Voor 41% gewijzigd door RedRose op 25-04-2003 13:29 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 13:48

Kaastosti

Vrolijkheid alom!

Topicstarter
Riight.

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.

Pagina: 1