[PHP] Return returned niet.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey allen,

ik heb een recursieve functie om een array uit te poepen die vervolgens door de template parser omgebouwd kan worden naar wat je maar wilt.

Er is echter een groot probleem, de functie returned niet.

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
  function breadcrumb( $current, $iteration = 0, $crumbs = array() )
  {
      
    global $DB;
      
    $DB->query( 'SELECT `id`,`parent_id`,`name` FROM `i_category` WHERE `id` = [id]' );
    $DB->replace( 'id', $current );
    $DB->execute();
    $crumb = $DB->fetchRow();
      
    $crumbs[ $iteration ][ 'id' ]   = $crumb[ 'id' ];
    $crumbs[ $iteration ][ 'name' ] = $crumb[ 'name' ];
      
    if( $crumb[ 'parent_id' ] != 0 )
    {
      
      breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, $crumbs );
        
    } 
    else
    {
    
      # Hier gaat het mis, print werkt wel, return niet
      return $crumbs;
      
    }   
    
  }


Bij de comment waar het mis gaat gaat het ook echt mis. Als ik de functie aanroep alsvolgt:

PHP:
1
breadcrumb( 111 );


Dan returned deze NULL. Het wordt nog vreemder! Als ik op de plaats van de return een var_dump doe dan krijg ik een mooi lijstje van alles in de array. De $crumbs array bestaat dus echt op die plek, hij wordt alleen niet gereturned.

Ik zit me er nu al enige tijd op stuk te staren, misschien heeft iemand anders nog een idee?

Acties:
  • 0 Henk 'm!

Verwijderd

$crumbs = breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, $crumbs );

Dacht ik even, maar dat is niet de complete oplossing.
Manuzhai schreef op vrijdag 11 april 2008 @ 12:17:
Simpel: je returnt alleen in het "diepste" geval. Je moet het resultaat van het recursief aanroepen ook retourneren om een logische waarde te krijgen (in vrijwel alle gevallen resulteert het "externe" aanroepen van breadcrumbs in het uitvoeren van het gedeelte onder het ifje, en dat returnt niets).
return breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, $crumbs );
was het inderdaad. ;)

[ Voor 255% gewijzigd door Verwijderd op 11-04-2008 12:19 ]


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Simpel: je returnt alleen in het "diepste" geval. Je moet het resultaat van het recursief aanroepen ook retourneren om een logische waarde te krijgen (in vrijwel alle gevallen resulteert het "externe" aanroepen van breadcrumbs in het uitvoeren van het gedeelte onder het ifje, en dat returnt niets).

Rustacean


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Manuzhai schreef op vrijdag 11 april 2008 @ 12:17:
Simpel: je returnt alleen in het "diepste" geval. Je moet het resultaat van het recursief aanroepen ook retourneren om een logische waarde te krijgen (in vrijwel alle gevallen resulteert het "externe" aanroepen van breadcrumbs in het uitvoeren van het gedeelte onder het ifje, en dat returnt niets).
Niet helemaal correct aangezien ik telkens de array doorgeef aan de volgende aanroep om hem bij te vullen en dan op het diepste niveau gewoon een array terugkrijg met alle parents die ophoogt totdat hij bij de laatste aankomt. Die array dient dan andersom gesorteerd te worden en hij klopt.

Nogmaal, als ik var_dump doe in plaats van return dan krijg ik dit als output (bijvoorbeeld):
code:
1
array(2) { [0]=>  array(2) { ["id"]=>  string(3) "102" ["name"]=>  string(8) "Beeldjes" } [1]=>  array(2) { ["id"]=>  string(3) "101" ["name"]=>  string(15) "Woonaccessoires" } }


Als ik echter var_dump doe op de breadcrumb( 111 ) krijg ik NULL ;(

[ Voor 3% gewijzigd door Verwijderd op 11-04-2008 12:20 ]


Acties:
  • 0 Henk 'm!

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Stel:

Category met het id 111 heeft een parent... Dan zal je functie niks retourneren als je de hem zo aanroept:

PHP:
1
breadcrumb( 111 );


Zo zal het al beter werken vermoed ik:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  function breadcrumb( $current, $iteration = 0, &$crumbs = array() )
  {
      
    global $DB;
      
    $DB->query( 'SELECT `id`,`parent_id`,`name` FROM `i_category` WHERE `id` = [id]' );
    $DB->replace( 'id', $current );
    $DB->execute();
    $crumb = $DB->fetchRow();
      
    $crumbs[ $iteration ][ 'id' ]   = $crumb[ 'id' ];
    $crumbs[ $iteration ][ 'name' ] = $crumb[ 'name' ];
      
    if( $crumb[ 'parent_id' ] != 0 )
    {
      
      breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, &$crumbs );
        
    } 
    
      return $crumbs;
    
  }

[ Voor 71% gewijzigd door Face_-_LeSS op 11-04-2008 12:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Face_-_LeSS schreef op vrijdag 11 april 2008 @ 12:24:
Stel:

Category met het id 111 heeft een parent... Dan zal je functie niks retourneren als je de hem zo aanroept:

PHP:
1
breadcrumb( 111 );


Zo zal het al beter werken vermoed ik:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  function breadcrumb( $current, $iteration = 0, &$crumbs = array() )
  {
      
    global $DB;
      
    $DB->query( 'SELECT `id`,`parent_id`,`name` FROM `i_category` WHERE `id` = [id]' );
    $DB->replace( 'id', $current );
    $DB->execute();
    $crumb = $DB->fetchRow();
      
    $crumbs[ $iteration ][ 'id' ]   = $crumb[ 'id' ];
    $crumbs[ $iteration ][ 'name' ] = $crumb[ 'name' ];
      
    if( $crumb[ 'parent_id' ] != 0 )
    {
      
      breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, &$crumbs );
        
    } 
    
      return $crumbs;
    
  }
De references was ik vergeten te vermelden maar die werken ook niet aangezien ik dan een:
code:
1
Call-time pass-by-reference has been deprecated;

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Recursie? Probeer dit dan eens:

PHP:
1
return breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, $crumbs );


Edit: hehe Minnema, ik was eerst :p

[ Voor 14% gewijzigd door wackmaniac op 11-04-2008 12:36 ]

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

Verwijderd

De references zijn ook niet nodig. Heb je dit al geprobeerd?

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
<?php
  function breadcrumb( $current, $iteration = 0, $crumbs = array() )
  {
      
    global $DB;
      
    $DB->query( 'SELECT `id`,`parent_id`,`name` FROM `i_category` WHERE `id` = [id]' );
    $DB->replace( 'id', $current );
    $DB->execute();
    $crumb = $DB->fetchRow();
      
    $crumbs[ $iteration ][ 'id' ]   = $crumb[ 'id' ];
    $crumbs[ $iteration ][ 'name' ] = $crumb[ 'name' ];
      
    if( $crumb[ 'parent_id' ] != 0 )
    {
      return breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, $crumbs );
    } 
    else
    {
      return $crumbs;
    }   
    
  }
?>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ahhh fuck :) als ik de references weghaal dan werkt het, zolang ik de return maar buiten de else houd. Ik snap het probleem al.

Bedankt Face_-_LeSS zonder dit had ik me hier nog een eeuw op stukgestaard!

Dit is nu de code geworden:
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
    function breadcrumb( $current, $iteration = 0, $crumbs = array() )
    {
      
      global $DB;
      
      $DB->query( 'SELECT * FROM `i_category` WHERE `id` = [id]' );
      $DB->replace( 'id', $current );
      $DB->execute();
      $crumb = $DB->fetchRow();
      
      $crumbs[ $iteration ][ 'id' ]   = $crumb[ 'id' ];
      $crumbs[ $iteration ][ 'name' ] = $crumb[ 'name' ];
      
      if( $crumb[ 'parent_id' ] != 0 )
      {
      
        $crumbs = breadcrumb( $crumb[ 'parent_id' ], $iteration + 1, $crumbs );
        
      } 
    
      sort( $crumbs );
      return $crumbs;
    
    }


De return moest dus buiten de else terecht komen, de references gaven me dus warnings.

Wat ik echter nog niet snap ik dat een var_dump binnen de else wel werkte en een return dus niet? De var_dump gaf gewoon een goede array etcetera. Ik bedoel, de functie hoeft niks te returnen om de crumbs door te geven aan de volgende aanroep?

Voor de goede orde, de manier van Minnema werkt ook. Heb me gewoon even verkeken op het niets returnen als de functie niet de eindbestemming heeft bereikt. Vind het dan alsnog raar dat var_dump op dezelfde variabele wel werkt en return niet.

[ Voor 23% gewijzigd door Verwijderd op 11-04-2008 12:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op vrijdag 11 april 2008 @ 12:32:

Wat ik echter nog niet snap ik dat een var_dump binnen de else wel werkte en een return dus niet? De var_dump gaf gewoon een goede array etcetera. Ik bedoel, de functie hoeft niks te returnen om de crumbs door te geven aan de volgende aanroep?
Omdat die var_dump niet wordt uitgevoerd in de iteratie die uiteindelijk jou je resultaat teruggeeft,
maar in een diepere iteratie (de hoogste parent). Die var_dump zag je. Natuurlijk heeft die array wel de uiteindelijk waarde, want het is immers de diepste iteratie.
Voor de goede orde, de manier van Minnema werkt ook.
Ik doe gewoon precies hetzelfde, het zit er alleen iets anders uit. ;)

[ Voor 17% gewijzigd door Verwijderd op 11-04-2008 12:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 11 april 2008 @ 12:39:
[...]

Omdat die var_dump niet wordt uitgevoerd in de iteratie die uiteindelijk jou je resultaat teruggeeft,
maar in een diepere iteratie (de hoogste parent). Die var_dump zag je. Natuurlijk heeft die array wel de uiteindelijk waarde, want het is immers de diepste iteratie.


[...]


Ik doe gewoon precies hetzelfde, het zit er alleen iets anders uit. ;)
Klopt maar ik geef je toch de props ;) Ik denk dat ik het wel snap nu, het mooiste is dat het nu werkt. Was nog nooit tegen dit aangelopen en heb toch wel wat recursieve functies gebouwd in mijn leven misschien dat ik deze keer onbewust dit probleem over het hoofd zag.
Pagina: 1