[PHP] Tweedimensionale array recursief vullen

Pagina: 1
Acties:
  • 131 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • Priet
  • Registratie: Januari 2001
  • Laatst online: 21:17

Priet

To boldly do what no one has..

Topicstarter
Ik probeer al twee dagen om recursief gegevens uit een database te lezen en in een tweedimensionale array te plaats. Tot nu toe is het me nog niet gelukt :|

Het gaat om een menustructuur die is opgeslagen in een database. De rubrieken in dit menu worden uit een database gehaald. De tabel ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
CREATE TABLE rubrieken (
  rubriek_id int(10) NOT NULL auto_increment,
  parent_id int(10) default NULL,
  module_id int(10) default NULL,
  naam varchar(255) NOT NULL default '',
  zichtbaar tinyint(1) NOT NULL default '1',
  volgorde int(10) NOT NULL default '0',
  PRIMARY KEY  (rubriek_id)
) TYPE=MyISAM;

Of misschien dat dit makkelijker leest:
code:
1
2
3
4
5
6
7
8
rubrieken
------------
  rubriek_id
  parent_id
  module_id
  naam
  zichtbaar
  volgorde


Ik heb nu in PHP een functie getParents(rubriek_id) die alle parents van de rubriek met de meegegeven rubriek_id ophaalt en teruggeeft.

De code is als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function getParents($rubriek_id) {
    static $counter = 0;
        
    $dbc = connect_to_database();
        
    $sql = "SELECT  *
                FROM    rubrieken
                WHERE   rubriek_id = 'rubriek_id'";
    $result = mysql_query($sql, $dbc);
        
    if ($result && mysql_num_rows($result) > 0) {
        $parent = mysql_fetch_array($result);
        if ($parent['parent_id']) 
                return array(getParents($parent['parent_id'])) + array($counter++, $parent); 
        else                
            return $parent;
    }           
    else
        return;
}


de $parent is dus een array met daarin de waarden van de velden uit de tabel:
PHP:
1
2
3
4
$parent['rubriek_id']
$parent['parent_id']
$parent['naam']
//etc.

Deze arrays (van elke parent eentje) wil ik teruggeven in een tweedimensionale array. Zodat het eerste element uit die tweedimensionale array het volgnummer van de parent aangeeft en het tweede element de waarden van die parent. Zoals dit:
PHP:
1
2
3
4
5
6
$arrParents[0]['rubriek_id']
$arrParents[0]['parent_id']
$arrParents[0]['naam']
$arrParents[1]['rubriek_id']
$arrParents[1]['parent_id']
$arrParents[1]['naam']

Ik dacht dat ik met deze code...
PHP:
1
return array(getParents($parent['parent_id'])) + array($counter++, $parent);

... wel een heel eind zou komen, maar dat blijkt dus niet goed te werken :'(

Met deze menustructuur:
code:
1
2
3
4
5
6
Globaal
  - Welkom
    - Wie zijn we
2004
  - Nieuws
    - Brieven


Krijg ik deze output als ik getParents(6) aanroep:
PHP:
1
2
3
4
5
Array ( [0] => 
Array ( [0] => 
Array ( [0] => 3 [rubriek_id] => 3 [1] => [parent_id] => [2] => [module_id] => [3] => 2004 [naam] => 2004 [4] => 1 [zichtbaar] => 1 [5] => 1 [volgorde] => 1 ) [1] => 
Array ( [0] => 5 [rubriek_id] => 5 [1] => 3 [parent_id] => 3 [2] => 0 [module_id] => 0 [3] => Nieuws [naam] => Nieuws [4] => 1 [zichtbaar] => 1 [5] => 0 [volgorde] => 0 ) ) [1] => 
Array ( [0] => 6 [rubriek_id] => 6 [1] => 5 [parent_id] => 5 [2] => 0 [module_id] => 0 [3] => Brieven [naam] => Brieven [4] => 1 [zichtbaar] => 1 [5] => 0 [volgorde] => 0 ) )

(Excuses voor het om zeep helpen van de layout :o)

Ik kom er echt niet meer uit. Ik krijg de meest exotische arrays terug, maar niet eentje werkt zoals ik had gehoopt.

Heeft iemand hier een oplossing voor?

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Je wilt dus de parents van een rubriek hebben....

PHP:
1
2
3
4
5
6
7
8
9
10
function getParents($rubriek_id){
  $query="SELECT * FROM rubrieken WHERE rubriek_id='{$rubriek_id}'";
  $result=mysql_query($query);
  if(mysql_num_rows($result)){
    $row=mysql_fetch_assoc($result);
    $row["parent"]=getParents($row["parent_id"]);
  } else {
    return false;
  }
}

Nou, dit geeft je een array terug die je vervolgens nog ff plat moet slaan, daar kan je vast wel wat mee.....

  • Priet
  • Registratie: Januari 2001
  • Laatst online: 21:17

Priet

To boldly do what no one has..

Topicstarter
Uhh daar snap ik ff niks van hoor, plat slaan :?

En daarbij geeft jouw oplossing ook niks terug, het doet alleen iets met die row.

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
PHP:
1
2
3
4
5
6
7
8
9
10
11
function getParents($rubriek_id){
  $query="SELECT * FROM rubrieken WHERE rubriek_id='{$rubriek_id}'";
  $result=mysql_query($query);
  if(mysql_num_rows($result)){
    $row=mysql_fetch_assoc($result);
    $row["parent"]=getParents($row["parent_id"]);
    return $row;
  } else {
    return false;
  }
}


sorry, de return vergeten. opzich spreekt de code redelijk voor zichzelf, had je opzich zelf ook kunnen bedenken ;)
ik heb het trouwens ook niet getest, gewoon ingeklopt. maar anyway, doe maar 's een print_r op het resultaat, dan zie je wat ik bedoel...

[ Voor 52% gewijzigd door chris op 25-09-2004 16:46 ]


  • Priet
  • Registratie: Januari 2001
  • Laatst online: 21:17

Priet

To boldly do what no one has..

Topicstarter
Mjah ik heb 't ff iets anders opgelost:

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
function getParents($intPageID) {
    static $counter = 0;
        
    $dbc = connect_to_database();
        
    $sql = "SELECT  *
                FROM    rubrieken
                WHERE   rubriek_id = '$intPageID'";
    $result = mysql_query($sql, $dbc);
        
    if ($result && mysql_num_rows($result) > 0) {
        $parent = mysql_fetch_array($result);
        if ($parent['parent_id']) {
            // Enkelvoudig ipv tweedimensionaal:
            //return getParents($parent['parent_id']) + array($counter++ => $parent['naam']); 
            return getParents($parent['parent_id']) + array($counter++ => $parent); 
        }
        else {
            // Enkelvoudig ipv tweedimensionaal:
            //return array($counter++ => $parent['naam']);
            return array($counter++ => $parent);
        }
    }           
    else
        return;
}

Ik ben eerst maar eens simpel begonnen: niet tweedimensionaal, maar met één element. Resultaat was een array met alleen de id's van de rubrieken. Dat is nu nog te zien in het commentaar.
Dat ging goed en toen was het natuurlijk een fluitje van een cent om het te veranderen naar een tweedimensionale array :)

En nu werkt het dus :) Wat ben ik toch slim :P

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Gefeli :)

maar toch wat opmerkingen:
code:
1
$dbc = connect_to_database();

waarom staat dat niet gewoon helemaal bovenaan in je code? Dus niet in de functie zelf, zo hoef je maar een keer te connecten.
code:
1
$result = mysql_query($sql, $dbc);

die $dbc kan je weglaten, php gebruikt automatisch de laatst geopende db-connectie.
code:
1
return array($counter++ => $parent);

Dit is al helemaal overbodig. Er zijn hele mooie dingen om zo'n counter niet nodig te hebben:

code:
1
2
3
4
$arr=array();
$arr[]=array("name"=>"blah");
$arr[]="test";
$arr[]=4;

nu heb je de volgende array:
code:
1
2
3
4
5
array (
  0=>array("name"=>"bla"),
  1=>"test",
  2=>4
);


je hebt dus die $counter helemaal niet nodig!

[ Voor 10% gewijzigd door chris op 25-09-2004 18:22 ]


Acties:
  • 0 Henk 'm!

  • Priet
  • Registratie: Januari 2001
  • Laatst online: 21:17

Priet

To boldly do what no one has..

Topicstarter
chris schreef op 25 september 2004 @ 18:22:
maar toch wat opmerkingen:
Graag, dit soort opmerkingen zijn altijd welkom :)
chris schreef op 25 september 2004 @ 18:22:
code:
1
$dbc = connect_to_database();

waarom staat dat niet gewoon helemaal bovenaan in je code? Dus niet in de functie zelf, zo hoef je maar een keer te connecten.
Dus als ik het goed begrijp hoef je altijd maar één keer een connectie naar de database te maken? Ook bijvoorbeeld in de situatie waarin het object $a een functie aanroept van object $b dat iets in de database moet opzoeken. Dan is het dus voldoende om (één keer) de connectie in de constructor van $a te maken zodat alle latere functies en objecten van deze verbinding gebruik kunnen maken?
chris schreef op 25 september 2004 @ 18:22:
code:
1
return array($counter++ => $parent);

Dit is al helemaal overbodig. Er zijn hele mooie dingen om zo'n counter niet nodig te hebben:

code:
1
2
3
4
$arr=array();
$arr[]=array("name"=>"blah");
$arr[]="test";
$arr[]=4;

nu heb je de volgende array:
code:
1
2
3
4
5
array (
  0=>array("name"=>"bla"),
  1=>"test",
  2=>4
);


je hebt dus die $counter helemaal niet nodig!
Hmm ja zoiets wist ik al wel. Ik had het gebruikt met de array van een element. Maar met de tweedimensionale array wou het niet echt lukken, daarom heb ik het ff zo opgelost. Maar dat werkt achteraf ook niet helemaal, omdat die counter alleen de eerste keer op nul begint en elke volgende aanroep dus niet meer klopt :Y)

Maar hier zal ik nog even naar kijken, misschien kom ik zo tot een nettere oplossing. Bedankt iig :)

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"

Pagina: 1