PHP中的递归类别树来自restful API

问题描述 投票:0回答:1

我需要一些帮助,结合PHP中的递归函数和从restful 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($ products_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" }
php
1个回答
1
投票

您的响应在“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元素。您可能希望根据实际需要进行更改...

Avoid empty ul tags

根据评论中的要求:只检查递归调用的结果。如果它是空的,跳过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;
}
© www.soinside.com 2019 - 2024. All rights reserved.