login  Naam:   Wachtwoord: 
Registreer je!
 Forum
Zoeken  Regels  Help
Categorieën > PHP & SQL

Recursieve array opbouwen.

roy – 09/03/2010 21:57


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


Pagina:

14 antwoorden

Gesponsorde links
Daisycon - Verdien geld met uw website

ArieMedia – 09/03/2010 23:43 (Laatst gewijzigd op 09/03/2010 23:43)
  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. ?>


roy – 10/03/2010 08:37
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..

marten – 10/03/2010 09:25

Wave6 – 10/03/2010 09:39 (Laatst gewijzigd op 10/03/2010 10:16)
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 

roy – 10/03/2010 19:03 (Laatst gewijzigd op 10/03/2010 23:17)
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??

avdg – 10/03/2010 23:30 (Laatst gewijzigd op 10/03/2010 23:32)
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. }


roy – 10/03/2010 23:36
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.



avdg – 11/03/2010 00:16 (Laatst gewijzigd op 11/03/2010 00:39)
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. }


Joost – 11/03/2010 16:48
http://www.site...s#dbarrays
Volgensmij heb je dat nodig. 

ArieMedia – 11/03/2010 16:51
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 ;).

Gesponsorde links


Pagina:

Dit onderwerp is gesloten.
Actieve forumberichten:

© 2002-2012 Sitemasters.be - Regels - Gehost door: Vircon - Laadtijd: 0.162s