login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Recursieve array opbouwen.

Offline roy - 09/03/2010 21:57
Avatar van royPHP gevorderde

Beste Allemaal,

Ik heb de volgende tabel: menu

ID | Parent_id | title
1 | 0 |
2 | 0 |
3 | 0 |
4 | 2 |
5 | 2 |
6 | 2 |
7 | 5 |
8 | 5 |
9 | 7 |
10| 0 |


Hoe kan ik de database uitlezen en een mooie recursieve array terug geven?

Ik heb in iedergeval een soortgelijke query nodig: select ID, Parent_id From menu where Parent_id = ?

Wie kan mij een stuk verder opweg helpen?


Groeten,
Roy

14 antwoorden

Gesponsorde links
Offline ArieMedia - 09/03/2010 23:43 (laatste wijziging 09/03/2010 23:43)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
  1. <?php
  2.  
  3. function BuildMenu($oConn) {
  4. $sql = 'SELECT id, parent, naam, url, extern
  5. FROM menu
  6. ORDER BY volgorde';
  7. $rs = $oConn->Execute($sql);
  8. for($i=0, $x=$rs->RecordCount(); $i<$x; $i++, $rs->MoveNext()) {
  9. $aMenu[$rs->Fields('parent')][$rs->Fields('id')] = array(
  10. 'naam' => $rs->Fields('naam'),
  11. 'url' => $rs->Fields('url'),
  12. 'extern' => $rs->Fields('extern')
  13. );
  14. }
  15.  
  16. return MaakMenu($aMenu, $aMenu[0]);
  17. }
  18.  
  19. function MaakMenu($aMenu, $aCurrent) {
  20. $sRet = '<ol>';
  21. foreach($aCurrent as $iID => $aItem) {
  22. if($aItem['extern'] == 'ja') {
  23. $sRet .= '<li class="pijltje"><a href="http://'.$aItem['url'].'">'.$aItem['naam'].'</a></li>';
  24. } else {
  25. $sRet .= '<li class="pijltje"><a href="http://dev.ariemedia.nl/'.$aItem['url'].'">'.$aItem['naam'].'</a></li>';
  26. }
  27. if(isset($aMenu[$iID])) {
  28. $sRet .= MaakMenu($aMenu, $aMenu[$iID]);
  29. }
  30. }
  31. $sRet .= '</ol>';
  32. return $sRet;
  33. }
  34.  
  35. ?>
Offline roy - 10/03/2010 08:37
Avatar van roy PHP gevorderde Ik wil oneindig veel niveaus diep kunnen uitlezen.(recursief)
volgens mij gaat dat niet met bovenstaande. Bovendien wil ik dat de functie een array teruggeeft waarin de niveaus zichtbaar zijn..
Offline marten - 10/03/2010 09:25
Avatar van marten Beheerder Kijk hier eens:

http://dev.mysq...-data.html
Offline Wave6 - 10/03/2010 09:39 (laatste wijziging 10/03/2010 10:16)
Avatar van Wave6 PHP beginner References:)

  1. <?php
  2. $aMenu[0]['id'] = 1;
  3. $aMenu[0]['parent_id'] = 0;
  4. $aMenu[0]['title'] = 'item 1';
  5. $aMenu[1]['id'] = 2;
  6. $aMenu[1]['parent_id'] = 1;
  7. $aMenu[1]['title'] = 'item 2';
  8. $aMenu[2]['id'] = 3;
  9. $aMenu[2]['parent_id'] = 2;
  10. $aMenu[2]['title'] = 'item 3';
  11. $aMenu[3]['id'] = 4;
  12. $aMenu[3]['parent_id'] = 2;
  13. $aMenu[3]['title'] = 'item 4';
  14. function orderMenuArray($p_aArray) {
  15.  
  16. $aData = $p_aArray;
  17.  
  18. $iIndex =0;
  19. $aRefs = array();
  20. $aList = array();
  21.  
  22. while(isset($aData[$iIndex])) {
  23. $rThisref = &$aRefs[$aData[$iIndex]['id']];
  24. $rThisref['id'] = $aData[$iIndex]['id'];
  25. $rThisref['parent_id'] = $aData[$iIndex]['parent_id'];
  26. $rThisref['title'] = $aData[$iIndex]['title'];
  27.  
  28. if($aData[$iIndex]['parent_id'] == 0) {
  29.  
  30. $aList[$aData[$iIndex]['id']] = &$rThisref;
  31. } else {
  32.  
  33. $aRefs[$aData[$iIndex]['parent_id']]['children'][$aData[$iIndex]['id']] = &$rThisref;
  34. }
  35. $iIndex++;
  36.  
  37. }
  38. return $aList;
  39. }
  40. $aResult = orderMenuArray($aMenu);
  41. print_r($aResult);
  42. ?>


Zo zou het kunnen werken:)

Deze code is niet het makkelijkste maar als je hem goed leest... dan kom je er wel uit.
Tenminste als je weet wat het nut van een reference is.
Je kunt deze code gewoon kopieren en uitvoeren om te zien wat het resultaat is 
Offline roy - 10/03/2010 19:03 (laatste wijziging 10/03/2010 23:17)
Avatar van roy PHP gevorderde Ik wil oneindig veel niveaus diep kunnen uitlezen.(recursief)

De functie moet een array teruggeven, die de niveaus ook weergeeft. (nested array ?)
Array niveau 1 = alle hoofditems
Array niveau 2 = alle subitems
Array niveau 3 = alle sussubitems
etc. etc..

Wie kan me opweg helpen??
Offline avdg - 10/03/2010 23:30 (laatste wijziging 10/03/2010 23:32)
Avatar van avdg PHP gevorderde zoiets? (niet getest en nog volledig aan te passen naar wens)
  1. /*Structuur array:
  2.  *
  3.  * array(
  4.  * 'menu' => 'content',
  5.  * 'menu2' => array(
  6.  * //submenu
  7.  * 'menu2 item1' => 'nog wat content dinges'
  8.  * )
  9.  *);
  10.  */
  11.  
  12. function menu($array){
  13. //eerst een nieuwe lijst aanmaken
  14. $return = "<ul>\n";
  15.  
  16. //alle elementen doorlopen
  17. foreach($array as $menu => $content){
  18. if(is_array($content){
  19. $return .= menu($content);
  20. } elseif (is_string($content){
  21. $return .= '<li>' . $content . "<li>\n";
  22. }
  23. }
  24.  
  25. //natuurlijk de lijst sluiten en dan de output teruggeven
  26. return $return . "</ul>\n";
  27. }
Offline roy - 10/03/2010 23:36
Avatar van roy PHP gevorderde Hi,

Dat lijkt al meer op wat ik bedoel.

Maar het probleem zit niet in het uitlezen van de array, dat doe ik met smarty of jQuery..

Het probleem zit hem juist in het maken van die array met de data uit de database.


Offline avdg - 11/03/2010 00:16 (laatste wijziging 11/03/2010 00:39)
Avatar van avdg PHP gevorderde Weer wat ongeteste code, hopelijk werkt em
(eigenlijk is het de algoritme dat telt, en niet de code)
  1. /**
  2.  * belangrijk: keys moeten in numerieke volgorde staan en parent id moet bestaan(altijd leuk)
  3.  * formaat:
  4.  * array(
  5.  * //v- menu id
  6.  * //v- parent id
  7.  * 1 => 0,
  8.  * 2 => 0,
  9.  * 3 => 2
  10.  * )
  11.  */
  12. function pointingArray2recursiveArray($array){
  13. $return = array();
  14.  
  15. foreach($array as $menu => $parent){
  16. //get the path to 0
  17. $position = $parent;
  18. $stack = array();
  19.  
  20. //get the position of the menu item
  21. while($position){//loop till $position is 0
  22. array_unshift($stack, $position);
  23. }
  24.  
  25. //attach it recursive
  26. $array = addNode($array, $stack);
  27. }
  28. return $array;
  29. }
  30.  
  31. /**
  32.  * Deze functie helpt met het zetten van een element op zijn juiste plaats
  33.  */
  34. function addNode($array, $stack){
  35. //no need to add nodes on empty stacks
  36. if(null == ($id = shift($stack))){
  37. return $array;
  38. }
  39.  
  40. //missing value - that should be the last element
  41. if(!isset($array[$id]){
  42. //to avoid looping loops, just add and return, instead of making a new recursion
  43. $array[$id] = array();
  44. } else {
  45. $array[$id] = addNode($array, $id);
  46. }
  47. return $array;
  48. }
Offline Joost - 11/03/2010 16:48
Avatar van Joost PHP expert http://www.site...s#dbarrays
Volgensmij heb je dat nodig. 
Offline ArieMedia - 11/03/2010 16:51
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
roy schreef:
Ik wil oneindig veel niveaus diep kunnen uitlezen.(recursief)
volgens mij gaat dat niet met bovenstaande. Bovendien wil ik dat de functie een array teruggeeft waarin de niveaus zichtbaar zijn..
Dat kan zeker wel met de code die ik gaf ;).
Offline Wave6 - 12/03/2010 11:19
Avatar van Wave6 PHP beginner
roy schreef:
Ik wil oneindig veel niveaus diep kunnen uitlezen.(recursief)


Als je mijn code eens probeert... gewoon even copy&paste.
Dan zie je wat er gebeurt.

Geloof me, met dit kun je onbeperkt niveau's diep gaan.
Offline roy - 13/03/2010 19:41
Avatar van roy PHP gevorderde Maar het probleem zit niet in het uitlezen van de array, dat doe ik met smarty of jQuery..

Het probleem zit hem juist in het maken van die array met de data uit de database.
Offline Wave6 - 15/03/2010 09:07
Avatar van Wave6 PHP beginner Ja dat doet mijn script toch ook?
Ik laat alleen zien hoe die array in elkaar zit met een print_r?
Offline Ibrahim - 16/03/2010 17:06
Avatar van Ibrahim PHP expert Een oneindig aantal niveaus is te bereiken door alle categorieën op te halen met hun id's en hun parentid's. Daarna loop je door deze grote array en sorteer je ze op basis van hun parentid. Zo hoef je maar 1x alle categorieën op te halen, maar kun je alsnog een recursieve functie gebruiken.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.31s