我需要结合使用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>
问题是当我尝试从宁静的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" }
答案 0 :(得分:1)
您的响应的菜单项在“类别”键下列出,因此您需要获取该键的值。
然后一个简单的递归函数将像这样:
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;
}