Как создать вложенный JSON для многоуровневого списка меню, используя PHP и MYSQL?

0

Я пытаюсь создать многоуровневый вложенный JSON, используя данные MySQL, используя PHP.

Мне понадобится этот JSON, чтобы позже я мог использовать jQuery для создания HTML-меню.

Но я в настоящее время изо всех сил пытаюсь создать мой многоуровневый вложенный JSON. Я нашел 100 подобных вопросов на веб-сайте Stackoverflow и google, но все они немного разные.

В принципе, у меня есть база данных 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

  • 0
    Так что же вы ожидаете получить? Приведите нам пример. Нехорошо говорить, что что-то не так, если ты не определяешь, что правильно.
  • 0
    @ Адисон, да, ты прав и сожалеешь об этом. Я отредактировал свой вопрос.
Показать ещё 2 комментария
Теги:

1 ответ

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);
?>
  • 0
    Подскажите, пожалуйста, как я могу использовать вашу функцию в моем SQL-запросе?
  • 0
    Неустранимая ошибка: вызов неопределенной функции add_some_more ()
Показать ещё 15 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню