Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: foreach wielokrotne zapętlenie
Forum PHP.pl > Forum > PHP
phpowiec84
Witam

zbudowałem drzwo kategori z wykorzystaniem SQL , gdzie podkategoria zawiera w tabeli parent ,id kategori nadrzędnej .
I teraz , posiadam pętle foreach w widuku (kohana) i chciałbym wyświetlić całe drzewo bez potrzeby budowania funkcji w widoku
pętla wygląda tak :

  1. foreach($tabela as $row)
  2. {
  3. if($row['parent'] == 0)
  4. {
  5. foreach($tabela as $_row)
  6. {
  7. if($_row['parent'] == $row['id'])
  8. {
  9. // .....
  10. }
  11. }
  12. }
  13. }


czy jest możliwośc jej wielokrotnego zapętlenia bez potrzeby pisania do tego funkcji ?
lukaskolista
Chyba nie. Proponuje wykorzystac nested sets (ja zrobilem sobie do tego modul w kohana)
Noidea
Będzie działać. foreach działa na kopii tablicy i każda taka kopia jest iterowana osobno, więc się ze sobą nie gryzie.
  1. <?php
  2.  
  3. $array = array( 1, 2, 3 );
  4.  
  5. foreach( $array as $item_level_1 )
  6. {
  7. foreach( $array as $item_level_2 )
  8. {
  9. echo "$item_level_1 - $item_level_2 \n";
  10. }
  11. }
  12.  
  13. // WYNIK:
  14. // 1 - 1
  15. // 1 - 2
  16. // 1 - 3
  17. // 2 - 1
  18. // 2 - 2
  19. // 2 - 3
  20. // 3 - 1
  21. // 3 - 2
  22. // 3 - 3
  23.  
  24. ?>

Ale nie polecam takiego rozwiązania twojego problemu.
kiler129
A nie możesz użyć rekurencji?
Wycinek kodu z mojego cmsu:

  1. <?php
  2. function menuParentsList($pid=0, $depth=0) {
  3. $rep = $this->_dbObj->fetchAll("SELECT * FROM `menu` WHERE `parent_id` = :pid ORDER BY `position`", array(":pid" => array("data" => $pid, "dataType" => PDO::PARAM_INT)));
  4. $rep_c = sizeof($rep);
  5. if($rep_c==0)return;
  6.  
  7. $ret="";
  8. for($i=0; $i<$rep_c; $i++) {
  9. $ret .= str_repeat("\t",$depth)."<option value=\"".$rep[$i]["id"]."\">".str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;",$depth).$rep[$i]["name"]."</option>\n";
  10. $ret .= $this->menuParentsList($rep[$i]["id"], ($depth+1)); //Maybe children has childrens? ;]
  11. }
  12.  
  13. return $ret;
  14. }
  15.  
  16. function showMenu($pid=0, $depth=0, $insideCall=false) { //If insideCall is true do not add headers (used in recursive call)
  17. $data = $this->_dbObj->fetchAll("SELECT * FROM `menu` WHERE `parent_id` = :pid ORDER BY `position`", array(":pid" => array("data" => $pid, "dataType" => PDO::PARAM_INT)));
  18. $data_c = sizeof($data);
  19. if($data_c==0) {
  20. if(!$insideCall)echo "<b>".LNG_MENU_EMPTY_MENU."</b>";
  21. return;
  22. }
  23.  
  24. if(!$insideCall) {
  25. $ret = '<div style="font-size:1.4em; line-height:1.4em; position:relative; left:20px;">';
  26. $ret .= "<dl>";
  27. } else { $ret = ""; }
  28.  
  29. for($i=0;$i<$data_c;$i++) {
  30. if($data[$i]["link_type"] == "subpage") { //Rewrite link for subpage
  31. $data[$i]["link"] = HTTP_PATH."/page/".$data[$i]["link"]."/page.html";
  32. } elseif($data[$i]["link_type"] == "article") { //Rewrite link for article
  33. $data[$i]["link"] = HTTP_PATH."/article/".$data[$i]["link"]."/article.html";
  34. } else { //Rewrite link for any other (if none fail it`s external link ;])
  35. $data[$i]["link"] = HTTP_PATH."/redirect/".base64_encode($data[$i]["link"])."/";
  36. }
  37.  
  38. $ret .= str_repeat("\t",$depth).'<dt id="'.$data[$i]["id"].'-cnt" style="padding-top: 5px;">'.str_repeat("&nbsp;&nbsp;",$depth).'<a href="'.$data[$i]["link"].'">'.$data[$i]["name"].'</a> ';
  39.  
  40. if($i != 0) {
  41. $ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="moveElement(this.id, \'up\');"><img src="images/mve_up.gif"></a> ';
  42. } else {
  43. $ret .= '<img src="images/mve_up_bw.gif"></a> '; //Move up is impossible - it`s first element
  44. }
  45.  
  46. if(($i+1) != $data_c) {
  47. $ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="moveElement(this.id, \'dwn\');"><img src="images/mve_dwn.gif"></a> ';
  48. } else {
  49. $ret .= '<img src="images/mve_dwn_bw.gif"></a> '; //Move down is impossible - it`s last element
  50. }
  51.  
  52. $ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="editElement(this.id);"><img src="images/edit.gif"></a> '; //Edit element
  53. $ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="deleteElement(this.id);"><img src="images/del.gif"></a></dt>'; //Delete element
  54. $ret .= $this->showMenu($data[$i]["id"], ($depth+1), true); //Maybe children has childrens? ;] | do not add html "box"
  55. }
  56.  
  57. if(!$insideCall) {
  58. $ret .= '</dl></div>';
  59. }
  60.  
  61. return $ret;
  62. }?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.