簡體   English   中英

來自Restful API的PHP中的遞歸類別樹

[英]Recursive category tree in PHP from restful API

我需要結合使用PHP中的遞歸函數和從寧靜的API檢索的類別樹菜單的一些幫助

當我從MYSQL檢索數據時,遞歸函數正常工作。 這是代碼:

<nav>
<?php 
function get_menu_tree($parent_id) 
{
    global $con;
    $menu = "";
    $sqlquery = " SELECT * FROM menu where status='1' and parent_id='" .$parent_id . "' ";

    $res=mysqli_query($con,$sqlquery);
    while($row=mysqli_fetch_array($res,MYSQLI_ASSOC)) 
    {
       $menu .="<li class='dropdown tt-megamenu-col-01'>";
       $menu .="<a href='".$row['link']."'>".$row['menu_name']."</a>";
       $menu .="<div class='dropdown-menu'>";
       $menu .="<ul class='tt-megamenu-submenu'>".get_menu_tree($row['menu_id'])."</ul>";

       $menu .= "</li>";

    }

    return $menu;
} 
?>

<ul>
    <?php echo get_menu_tree(0);//start from root menus having parent id 0 ?>
</ul>
</nav>

問題是當我嘗試從Restful API檢索示例類別樹菜單時。 該API檢索JSON,並且我知道如何解碼以創建數組,但是我不知道如何制作與MYSQL數據相同的類別樹。

  $productos_url = "http://XXX.XXXXX.com/categorias.ashx";
  $productos_url_json = file_get_contents($productos_url);
  $productos_url_array = json_decode($productos_url_json, true);

后續代碼var_dump($ productos_url_array);

array(3) { ["Categorias"]=> array(46) { [0]=> array(4) { ["idTipoProducto"]=> int(1) ["Nombre"]=> string(5) "MESAS" ["idPadre"]=> int(0) ["Link"]=> string(18) "../pages/mesas.php" } [1]=> array(4) { ["idTipoProducto"]=> int(2) ["Nombre"]=> string(6) "SILLAS" ["idPadre"]=> int(0) ["Link"]=> string(19) "../pages/sillas.php" } [2]=> array(4) { ["idTipoProducto"]=> int(3) ["Nombre"]=> string(9) "CABECEROS" ["idPadre"]=> int(0) ["Link"]=> string(22) "../pages/cabeceros.php" } [3]=> array(4) { ["idTipoProducto"]=> int(4) ["Nombre"]=> string(5) "BAJOS" ["idPadre"]=> int(0) ["Link"]=> string(18) "../pages/bajos.php" } [4]=> array(4) { ["idTipoProducto"]=> int(5) ["Nombre"]=> string(8) "BAJOS TV" ["idPadre"]=> int(0) ["Link"]=> string(21) "../pages/bajos-tv.php" } [5]=> array(4) { ["idTipoProducto"]=> int(7) ["Nombre"]=> string(8) "SILLONES" ["idPadre"]=> int(0) ["Link"]=> string(21) "../pages/sillones.php" } [6]=> array(4) { ["idTipoProducto"]=> int(8) ["Nombre"]=> string(10) "ESCRITORIO" ["idPadre"]=> int(0) ["Link"]=> string(23) "../pages/escritorio.php" } [7]=> array(4) { ["idTipoProducto"]=> int(9) ["Nombre"]=> string(8) "VITRINAS" ["idPadre"]=> int(0) ["Link"]=> string(21) "../pages/vitrinas.php" } [8]=> array(4) { ["idTipoProducto"]=> int(10) ["Nombre"]=> string(11) "BIBLIOTECAS" ["idPadre"]=> int(0) ["Link"]=> string(24) "../pages/bibliotecas.php" } [9]=> array(4) { ["idTipoProducto"]=> int(11) ["Nombre"]=> string(8) "CONSOLAS" ["idPadre"]=> int(0) ["Link"]=> string(21) "../pages/consolas.php" } [10]=> array(4) { ["idTipoProducto"]=> int(12) ["Nombre"]=> string(13) "MESAS RATONAS" ["idPadre"]=> int(0) ["Link"]=> string(26) "../pages/mesas-ratonas.php" } [11]=> array(4) { ["idTipoProducto"]=> int(13) ["Nombre"]=> string(16) "MESAS AUXILIARES" ["idPadre"]=> int(0) ["Link"]=> string(29) "../pages/mesas-auxiliares.php" } [12]=> array(4) { ["idTipoProducto"]=> int(14) ["Nombre"]=> string(7) "ESPEJOS" ["idPadre"]=> int(0) ["Link"]=> string(20) "../pages/espejos.php" } [13]=> array(4) { ["idTipoProducto"]=> int(15) ["Nombre"]=> string(17) "RESPALDOS SOMMIER" ["idPadre"]=> int(0) ["Link"]=> string(30) "../pages/respaldos-sommier.php" } [14]=> array(4) { ["idTipoProducto"]=> int(16) ["Nombre"]=> string(13) "CAMA COMPLETA" ["idPadre"]=> int(0) ["Link"]=> string(26) "../pages/cama-completa.php" } [15]=> array(4) { ["idTipoProducto"]=> int(17) ["Nombre"]=> string(10) "CARRO CAMA" ["idPadre"]=> int(0) ["Link"]=> string(23) "../pages/carro-cama.php" } [16]=> array(4) { ["idTipoProducto"]=> int(18) ["Nombre"]=> string(12) "MESAS DE LUZ" ["idPadre"]=> int(0) ["Link"]=> string(25) "../pages/mesas-de-luz.php" } [17]=> array(4) { ["idTipoProducto"]=> int(19) ["Nombre"]=> string(7) "COMODAS" ["idPadre"]=> int(0) ["Link"]=> string(20) "../pages/comodas.php" } [18]=> array(4) { ["idTipoProducto"]=> int(20) ["Nombre"]=> string(10) "PEINADORES" ["idPadre"]=> int(0) ["Link"]=> string(23) "../pages/peinadores.php" } [19]=> array(4) { ["idTipoProducto"]=> int(21) ["Nombre"]=> string(10) "DRESSOIRES" ["idPadre"]=> int(0) ["Link"]=> string(23) "../pages/dressoires.php" } [20]=> array(4) { ["idTipoProducto"]=> int(22) ["Nombre"]=> string(10) "CHIFFONIER" ["idPadre"]=> int(0) ["Link"]=> string(23) "../pages/chiffonier.php" } [21]=> array(4) { ["idTipoProducto"]=> int(23) ["Nombre"]=> string(9) "TABURETES" ["idPadre"]=> int(0) ["Link"]=> string(22) "../pages/taburetes.php" } [22]=> array(4) { ["idTipoProducto"]=> int(24) ["Nombre"]=> string(8) "MINIPIES" ["idPadre"]=> int(0) ["Link"]=> string(21) "../pages/minipies.php" } [23]=> array(4) { ["idTipoProducto"]=> int(25) ["Nombre"]=> string(5) "CUNAS" ["idPadre"]=> int(0) ["Link"]=> string(18) "../pages/cunas.php" } [24]=> array(4) { ["idTipoProducto"]=> int(26) ["Nombre"]=> string(10) "ESPECIALES" ["idPadre"]=> int(0) ["Link"]=> string(23) "../pages/especiales.php" } [25]=> array(4) { ["idTipoProducto"]=> int(27) ["Nombre"]=> string(8) "PERCHERO" ["idPadre"]=> int(0) ["Link"]=> string(21) "../pages/perchero.php" } [26]=> array(4) { ["idTipoProducto"]=> int(28) ["Nombre"]=> string(6) "REPISA" ["idPadre"]=> int(0) ["Link"]=> string(19) "../pages/repisa.php" } [27]=> array(4) { ["idTipoProducto"]=> int(29) ["Nombre"]=> string(9) "BANQUETAS" ["idPadre"]=> int(0) ["Link"]=> string(22) "../pages/banquetas.php" } [28]=> array(4) { ["idTipoProducto"]=> int(30) ["Nombre"]=> string(6) "ROPERO" ["idPadre"]=> int(0) ["Link"]=> string(19) "../pages/ropero.php" } [29]=> array(4) { ["idTipoProducto"]=> int(31) ["Nombre"]=> string(4) "PUFF" ["idPadre"]=> int(0) ["Link"]=> string(17) "../pages/puff.php" } [30]=> array(4) { ["idTipoProducto"]=> int(32) ["Nombre"]=> string(7) "BIOMBOS" ["idPadre"]=> int(0) ["Link"]=> string(20) "../pages/biombos.php" } [31]=> array(4) { ["idTipoProducto"]=> int(33) ["Nombre"]=> string(8) "ESTANTES" ["idPadre"]=> int(0) ["Link"]=> string(21) "../pages/estantes.php" } [32]=> array(4) { ["idTipoProducto"]=> int(34) ["Nombre"]=> string(11) "ILUMINACION" ["idPadre"]=> int(0) ["Link"]=> string(24) "../pages/iluminacion.php" } [33]=> array(4) { ["idTipoProducto"]=> int(35) ["Nombre"]=> string(9) "DIVISORES" ["idPadre"]=> int(0) ["Link"]=> string(22) "../pages/divisores.php" } [34]=> array(4) { ["idTipoProducto"]=> int(36) ["Nombre"]=> string(9) "BOTINEROS" ["idPadre"]=> int(0) ["Link"]=> string(22) "../pages/botineros.php" } [35]=> array(4) { ["idTipoProducto"]=> int(37) ["Nombre"]=> string(14) "MUEBLE PARA TV" ["idPadre"]=> int(0) ["Link"]=> string(27) "../pages/mueble-para-tv.php" } [36]=> array(4) { ["idTipoProducto"]=> int(38) ["Nombre"]=> string(5) "BARRA" ["idPadre"]=> int(0) ["Link"]=> string(18) "../pages/barra.php" } [37]=> array(4) { ["idTipoProducto"]=> int(39) ["Nombre"]=> string(7) "INSUMOS" ["idPadre"]=> int(0) ["Link"]=> string(20) "../pages/insumos.php" } [38]=> array(4) { ["idTipoProducto"]=> int(40) ["Nombre"]=> string(11) "DECORACION " ["idPadre"]=> int(0) ["Link"]=> string(24) "../pages/decoracion-.php" } [39]=> array(4) { ["idTipoProducto"]=> int(41) ["Nombre"]=> string(7) "HERRAJE" ["idPadre"]=> int(0) ["Link"]=> string(20) "../pages/herraje.php" } [40]=> array(4) { ["idTipoProducto"]=> int(42) ["Nombre"]=> string(12) "REPARACIONES" ["idPadre"]=> int(0) ["Link"]=> string(25) "../pages/reparaciones.php" } [41]=> array(4) { ["idTipoProducto"]=> int(43) ["Nombre"]=> string(4) "AAAA" ["idPadre"]=> int(4) ["Link"]=> string(17) "../pages/aaaa.php" } [42]=> array(4) { ["idTipoProducto"]=> int(44) ["Nombre"]=> string(4) "BBBB" ["idPadre"]=> int(43) ["Link"]=> string(17) "../pages/bbbb.php" } [43]=> array(4) { ["idTipoProducto"]=> int(45) ["Nombre"]=> string(4) "CCCC" ["idPadre"]=> int(4) ["Link"]=> string(17) "../pages/cccc.php" } [44]=> array(4) { ["idTipoProducto"]=> int(46) ["Nombre"]=> string(9) "FDFSDFDFD" ["idPadre"]=> int(3) ["Link"]=> string(22) "../pages/fdfsdfdfd.php" } [45]=> array(4) { ["idTipoProducto"]=> int(47) ["Nombre"]=> string(3) "ASA" ["idPadre"]=> int(22) ["Link"]=> string(16) "../pages/asa.php" } } ["Codigo"]=> int(0) ["Mensaje"]=> string(2) "OK" }

您的響應具有“ Categorias”鍵下列出的菜單項,因此您需要使用該鍵的值。

然后,一個簡單的遞歸函數將如下所示:

function get_menu_tree(&$menu_items, $parent_id) {
    $menu = "";
    foreach($menu_items as $row) {
        if ($row["idPadre"] != $parent_id) continue; 
        $menu .= "<li class='dropdown tt-megamenu-col-01'>"
                  . "<a href='" . $row['Link'] . "'>" . $row['Nombre'] . "</a>"
                  . "<ul class='dropdown-menu tt-megamenu-submenu'>" 
                      . get_menu_tree($menu_items, $row['idTipoProducto']) 
                  . "</ul>"
               . "</li>";
    }
    return $menu;
}

您需要這樣稱呼它:

$html = get_menu_tree($productos_url_array['Categorias'], 0);
echo $html;

請注意,您的代碼中產生了一個未封閉的div標簽。 另外,根據HTML標准, div不能是li元素的子元素。 因此,我將該div的class屬性移動到了下一個ul元素。 您可能需要將其更改為實際需求...

避免空的ul標簽

根據注釋中的要求:僅檢查遞歸調用的結果。 如果為空,請跳過ul生成:

function get_menu_tree(&$menu_items, $parent_id) {
    $menu = "";
    foreach($menu_items as $row) {
        if ($row["idPadre"] != $parent_id) continue; 
        $sub = get_menu_tree($menu_items, $row['idTipoProducto']);
        $menu .= "<li class='dropdown tt-megamenu-col-01'>"
                  . "<a href='" . $row['Link'] . "'>" . $row['Nombre'] . "</a>"
                  . ($sub ? 
                        "<ul class='dropdown-menu tt-megamenu-submenu'>$sub</ul>" : "")
               . "</li>";
    }
    return $menu;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM