Динамический многомерный массив переопределяет его

EDIT: Я экспериментировал какое-то время, и кажется, что это может быть SQL, который дает мне только одну строку за звонок, можно ли ее оптимизировать или написать по-другому?


Попытка создать / получить динамический многомерный массив / меню из БД, но он не распечатает все мои строки в БД. Пример: при печати двух строк я получаю только один из SQL, который я получил сейчас, при использовании вложенных массивов display_children я также получаю только одну строку для каждого массива. Я попытаюсь объяснить это явление примерами JSON ниже.

Я попытался отправить переменную через функцию, поэтому каждый вызов добавляет ее собственное значение уровня для каждой переменной внутри функции, но не справляется с этим.

Это пример моего результата (он стал более читаемым):

 [ { "category_id": "1", "title": "First test", "categories": [ { "category_id": "2", "title": "Second category", "categories": [ { "category_id": "3", "title": "3", "categories": "" } ] } ] } ] 

Это то, что я хочу / ожидаю:

 [ { "category_id": "1", "title": "First test", "categories": [ { "category_id": "2", "title": "Second category", "categories": [ { "category_id": "3", "title": "3", "categories": "" } ] }, { "category_id": "4", "title": "Fourth category", "categories": "" } ] } ] 

Таблицы БД:

ТаблицаТаблица

Вот код:

 <?php /* DB info and so on above this line */ function display_children($parent) { if(!empty($parent)) { global $dbh; $query = "SELECT category.*, GROUP_CONCAT(category_hierarchy.category_id SEPARATOR ',') AS subcategories FROM category LEFT JOIN category_hierarchy ON category_hierarchy.category_parent_id = category.category_id WHERE category.type = 2 AND "; $queryArr = array(); $queryArrValue = array(); $parents = explode(',', $parent); foreach($parents as $value) { $queryArr[] = "(category.category_id = ?)"; $queryArrValue[] = $value; } $queryArr = implode(' OR ', $queryArr); $query .= "(".$queryArr.")"; $query .= " ORDER BY category.sort_order ASC"; // Prepare. $stmt = $dbh->prepare($query); // Execute. $stmt->execute($queryArrValue); // Fetch results. $categories = $stmt->fetchAll(); $returnArr = array(); foreach($categories as $category) { if(!empty($category['subcategories'])) { $parent_arr = array(display_children($category['subcategories'])); } else { $parent_arr = ''; } $returnArr[] = array( 'category_id' => $category['category_id'], 'title' => $category['title'], 'slug' => $category['slug'], 'url' => $category['url'], 'type' => $category['type'], 'sort_order' => $category['sort_order'], 'categories' => $parent_arr ); } return $returnArr; } } $arr = array(); // Query. $query = "SELECT category.*, GROUP_CONCAT(category_hierarchy.category_id SEPARATOR ',') AS subcategories FROM category LEFT JOIN category_hierarchy ON category_hierarchy.category_parent_id = category.category_id WHERE category.type = 1 ORDER BY category.sort_order ASC "; // Prepare. $stmt = $dbh->prepare($query); // Execute. $stmt->execute(); // Fetch results. $categories = $stmt->fetchAll(); $countedRows = count($categories); foreach($categories as $category) { $parent_arr = ''; if(!empty($category['subcategories'])) { $parent_arr = array(display_children($category['subcategories'])); } $arr[] = array( 'category_id' => $category['category_id'], 'title' => $category['title'], 'slug' => $category['slug'], 'url' => $category['url'], 'type' => $category['type'], 'sort_order' => $category['sort_order'], 'categories' => $parent_arr ); } /* Output JSON */ header('Content-type: application/json'); echo json_encode($arr); die(); ?>