如何使用php和mysql为多级菜单列表创建嵌套json?

nmpmafwu  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(362)

我一直在尝试使用php创建一个使用mysql数据的多层嵌套json。
我需要这个json,以便稍后使用jquery创建html菜单。
但我目前正在努力创建多级嵌套json。我在stackoverflow网站和google上发现了100个类似的问题,但它们都略有不同。
基本上,我的mysql数据库是这样的:

id    post_title    post_parent

1     test 1         0
2     test 2         1
3     test 3         1
4     test 4         0
5     test 5         3
6     test 6         5
7     test 7         5

post_parent 是将它们链接在一起的列。
我尝试过使用下面的php代码,但是json输出是错误的。
我当前的php代码:

$return_arr=  array();
  $sql = mysqli_query($db_conx,"SELECT * FROM wp_posts WHERE post_status = 'publish' AND post_title !='Hello world!' AND post_title !='' ORDER BY post_title");
  while ($row = mysqli_fetch_array($sql ,MYSQLI_ASSOC)) 
  {

        if( !isset( $return_arr[ $row['post_parent'] ] ) ) {

            $return_arr[ $row['post_parent'] ] = array();

        }

        if( !isset( $return_arr[ $row['post_title'] ][ $row['post_title'] ] ) ) {

            $return_arr[ $row['post_parent'] ][ $row['post_title'] ] = array();

        }

  }       
  echo json_encode($return_arr);

上面代码的输出是这样的,这是错误的:

{

    "0": {
        "test 1": [],
             "test 4": []
    },
    "1": {
        "test 2": [],
            "test 3": []
    },
    "3": {
        "test 5": []
    },
    "5": {
        "test 6": [],
            "test 7": []
    }

}

这没有显示正确的多层嵌套json数据。
有人能就这个问题提出建议吗?
任何帮助都将不胜感激。
编辑:
我需要一个多层嵌套的json,如以下结构:

[  
 {
    "post_title":"Test 1",
    "children":[  
       {  
          "post_title":"test 3",
          "children":[  
             {  
                "post_title":"test 5",
                "children":[  
             {  
                "post_title":"test 6"
             },
              {  
                "post_title":"test 7"
             }
          ]
             }
          ]
       },
       {  
          "post_title":"test 2"
       }
    ]
 }
]

然后我可以创建一个多级菜单,如下所示:
https://www.jqueryscript.net/demo/menu-list-generator-jquery-rendermenu/index2.html

afdcj2ne

afdcj2ne1#

首先创建一个包含所有子级的数组,并使用post\父级作为索引。在下面的示例中,我使用\元素调用了这个数组$array\ u。之后,您需要一个单独的函数,以便可以使用这个递归函数。

<?php

$array_with_elements = array();

$sql = mysqli_query($db_conx,"SELECT * FROM wp_posts WHERE post_status = 'publish' AND post_title !='Hello world!' AND post_title !='' ORDER BY post_title");

while ($row = mysqli_fetch_array($sql ,MYSQLI_ASSOC)) { 
  $array_with_elements[$row['post_parent']][] = $row;
}

function add_children($array_with_elements, $wp_level){

  $nested_array = array();
  foreach($array_with_elements[$wp_level] as $wp_post){
    $obj = new stdClass();
    $obj->title = $wp_post['post_title'];
    $obj->id = $wp_post['ID'];
    // check if there are children for this item
    if(isset($array_with_elements[$wp_post['ID']])){
      $obj->children = add_children($array_with_elements, $wp_post['ID']); // and here we use this nested function again (and again)
    }
    $nested_array[] = $obj;
  }
  return $nested_array;
}

// starting with level 0
$return_arr = add_children($array_with_elements, 0);

// and convert this to json
echo json_encode($return_arr);
?>

相关问题