亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

php 中的 foreach(菜單和子菜單)

php 中的 foreach(菜單和子菜單)

PHP
MMMHUHU 2023-08-26 17:47:04
我已經通過 oop php 創建了一個菜單和子菜單,但 foreach 循環有問題。我想要實現的目標是讓子菜單數組僅在菜單數組的第三個元素中循環!我希望我描述得很好!這是 foreach 代碼:<ul id="navigation">    <?php    $HeaderMenuOBJ = new Headermenu();    $HeaderMenu = $HeaderMenuOBJ->getHeaderMenu();    $SubHeaderMenu = $HeaderMenuOBJ->getHeaderSubMenu();   //var_dump($SubHeaderMenu);   //var_dump($HeaderMenu);    foreach ($HeaderMenu as $row){        ?>        <li>            <a class="active"                 href="                    <?php                     echo $row['href'];                    ?>                ">                <?php echo($row['content']);?>                            </a>            <ul class="submenu">                <?php                     foreach ($SubHeaderMenu as $row){                ?>                <li>                    <a                         href="                            <?php                                echo $row['href'];                            ?>                            ">                            <?php                                 echo $row['content'];                            ?>                    </a>                </li>                <?php                  }                ?>            </ul>      </li>        <?php    } ?></ul>這是我的 DOM(一種從數據庫讀取數據的控制器):class Headermenu extends dbh {    public $main_query = "SELECT * FROM `header_menu` WHERE parent is null";    public $sub_query = "SELECT * FROM `header_menu` WHERE parent = 3";    public function getHeaderMenu(){       $menu = parent::connect()->query($this->main_query);        while($row = $menu->fetch_array()){            $rows[] = $row;            /*$submenu = parent::connect()->query(str_replace("@param",$header->PK_ID,$this->sub_query));           while($sub_header = $submenu-> fetch_array()){               $header->subheaders[]=$sub_header;           }*/           //$headers[] = $header;       }       return $rows;    } 
查看完整描述

1 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

直接回答:


首先,您需要在外部和內部 foreach 中使用 2 個不同的變量:foreach ($HeaderMenu as $menuRow){現在foreach ($SubHeaderMenu as $subMenuRow){兩者都有$row. 你可以這樣做:if ($menuRow['id'] == 3) { foreach ($SubHeaderMenu as $subMenuRow){- 所以將內部 foreach 包含在其中,if并且僅當父 id 為 3 時才執行此操作,但最好獲取所有 header_menu 行,將該數據轉換為嵌套數組并按動態結構顯示。


動態結構答案:


獲取所有菜單項,創建菜單數組,每個菜單都會有其子菜單項。然后顯示這個就很容易了。我假設只有兩個級別 - 菜單和子菜單。


樣本數據:


+----+-------+---------------+-----------+

| id | href  | content       | parent_id |

+----+-------+---------------+-----------+

|  1 | href1 | header1       |      NULL |

|  2 | href2 | header2       |      NULL |

|  3 | href3 | header3       |      NULL |

|  4 | href4 | subheader 1 1 |         1 |

|  5 | href5 | subheader 1 2 |         1 |

|  6 | href6 | subheader 2 1 |         2 |

+----+-------+---------------+-----------+

代碼:


<?php


$mysqli = new mysqli("localhost", "zz", "zz", "zz");


// fetch all menu items

$query = 'select * from header_menu order by parent_id';

$result = $mysqli->query($query);

$data = $result->fetch_all(MYSQLI_ASSOC);


var_dump($data);


// build menu with menus and their submenus

$menu = [];

foreach ($data as $row) {

  if ($row['parent_id'] === null) {

    $menu[$row['id']] = $row;

    $menu[$row['id']]['submenus'] = [];

  } else {

    $menu[$row['parent_id']]['submenus'][] = $row;

  }

}


var_dump($menu);


// now display it in html or however you want

foreach ($menu as $item) {

  echo $item['content'].PHP_EOL;

  foreach ($item['submenus'] as $subitem) {

    echo '  '.$subitem['content'].PHP_EOL;

  }

}

$數據:


array(6) {

  [0]=>

  array(4) {

    ["id"]=>

    string(1) "1"

    ["href"]=>

    string(5) "href1"

    ["content"]=>

    string(7) "header1"

    ["parent_id"]=>

    NULL

  }

  [1]=>

  array(4) {

    ["id"]=>

    string(1) "2"

    ["href"]=>

    string(5) "href2"

    ["content"]=>

    string(7) "header2"

    ["parent_id"]=>

    NULL

  }

  [2]=>

  array(4) {

    ["id"]=>

    string(1) "3"

    ["href"]=>

    string(5) "href3"

    ["content"]=>

    string(7) "header3"

    ["parent_id"]=>

    NULL

  }

  [3]=>

  array(4) {

    ["id"]=>

    string(1) "4"

    ["href"]=>

    string(5) "href4"

    ["content"]=>

    string(13) "subheader 1 1"

    ["parent_id"]=>

    string(1) "1"

  }

  [4]=>

  array(4) {

    ["id"]=>

    string(1) "5"

    ["href"]=>

    string(5) "href5"

    ["content"]=>

    string(13) "subheader 1 2"

    ["parent_id"]=>

    string(1) "1"

  }

  [5]=>

  array(4) {

    ["id"]=>

    string(1) "6"

    ["href"]=>

    string(5) "href6"

    ["content"]=>

    string(13) "subheader 2 1"

    ["parent_id"]=>

    string(1) "2"

  }

}

$菜單:


array(3) {

  [1]=>

  array(5) {

    ["id"]=>

    string(1) "1"

    ["href"]=>

    string(5) "href1"

    ["content"]=>

    string(7) "header1"

    ["parent_id"]=>

    NULL

    ["submenus"]=>

    array(2) {

      [0]=>

      array(4) {

        ["id"]=>

        string(1) "4"

        ["href"]=>

        string(5) "href4"

        ["content"]=>

        string(13) "subheader 1 1"

        ["parent_id"]=>

        string(1) "1"

      }

      [1]=>

      array(4) {

        ["id"]=>

        string(1) "5"

        ["href"]=>

        string(5) "href5"

        ["content"]=>

        string(13) "subheader 1 2"

        ["parent_id"]=>

        string(1) "1"

      }

    }

  }

  [2]=>

  array(5) {

    ["id"]=>

    string(1) "2"

    ["href"]=>

    string(5) "href2"

    ["content"]=>

    string(7) "header2"

    ["parent_id"]=>

    NULL

    ["submenus"]=>

    array(1) {

      [0]=>

      array(4) {

        ["id"]=>

        string(1) "6"

        ["href"]=>

        string(5) "href6"

        ["content"]=>

        string(13) "subheader 2 1"

        ["parent_id"]=>

        string(1) "2"

      }

    }

  }

  [3]=>

  array(5) {

    ["id"]=>

    string(1) "3"

    ["href"]=>

    string(5) "href3"

    ["content"]=>

    string(7) "header3"

    ["parent_id"]=>

    NULL

    ["submenus"]=>

    array(0) {

    }

  }

}

菜單結構的輸出:


header1

  subheader 1 1

  subheader 1 2

header2

  subheader 2 1

header3

現在您可以輸出所有菜單項及其子菜單項,而不僅僅是菜單 ID 3。


查看完整回答
反對 回復 2023-08-26
  • 1 回答
  • 0 關注
  • 136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號