如何使用PHP和MYSQL为多级菜单列表创建嵌套JSON?

时间:2018-04-10 16:00:51

标签: php mysql json

我一直在尝试使用PHP使用MySQL数据创建多级嵌套JSON。

我将需要这个JSON,以便稍后可以使用jQuery创建HTML菜单。

但我目前正在努力创建我的多级嵌套JSON。我在Stackoverflow网站和谷歌上发现了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

1 个答案:

答案 0 :(得分:1)

首先使用所有子节点创建一个数组,并使用post_parent作为索引。在下面的例子中,我调用了这个数组$ array_with_elements。之后,您需要一个单独的函数,以便您可以使用此递归。

    <?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);
?>