Мне нужна небольшая помощь с простой проблемой SQL/PHP, с которой я сталкиваюсь. У меня есть список задач, хранящихся в таблице, а затем категории для задач в таблице tasks_categories. Там есть внешний ключ категорииID, связывающий две таблицы.
То, что я хотел бы сделать, - это перечислить первую категорию, а затем все задачи. Затем перечислите вторую категорию и эти задачи. В настоящее время я просто перечисляю задачи в формате дерева.
Как мне изменить свой код (вставляемый ниже), чтобы отображать имя категории один раз, а затем его задачи, а затем следующую категорию и т.д.?
$query = mysqli_query($mysqli,'SELECT * FROM tasks join tasks_categories using (categoryID)');
while ($row = mysqli_fetch_assoc($query)) {
$menu_array[$row['taskID']] = array(
'taskName' => $row['taskName'],
'parentID' => $row['parentID'],
'categoryName' => $row['categoryName'],
'required' => $row['required']
);
}
function generate_menu($parentID)
{
global $menu_array;
$has_child = false;
foreach($menu_array as $key => $value) {
if ($value['parentID'] == $parentID) {
if ($has_child === false) {
$has_child = true;
echo '<ul>';
}
echo '<li>' . $value['taskName'];
if ($value['required'] == 1) {
echo '<span class="required">*</span>';
}
generate_menu($key);
echo '</li>';
}
}
if ($has_child === true) echo '</ul>';
}
generate_menu(0);
Я бы изменил запрос с помощью ORDER BY categoryID ASC
. Затем вы можете просто просмотреть результаты, отслеживая изменения категории. Каждый раз, когда он изменяется, вы печатаете имя категории и затем печатаете задания, пока не нажмете следующую категорию.
$currentCategoryID = -1;
foreach ( ... ) {
// ...
if ($categoryID != $currentCategoryID) { // Category has changed!
$currentCategoryID = $categoryID;
// Show Category Name
}
// Continue listing
}