Как поместить категории и подкатегории в поле выбора с помощью optgroup с помощью всего одного запроса с помощью php?

Я хотел бы знать, как можно с помощью одного запроса сделать поле выбора с категориями и подкатегориями с помощью optgroup.

Категория таблицы:

cat_id  int(10) unsigned Auto Increment  
cat_catid   int(10) unsigned NULL    
cat_name    varchar(100)

Содержание:

| cat_id | cat_catid | cat_name      |
+--------+-----------+----------------
|      1 |      NULL | Category - A  |
|      2 |         1 | 1             |
|      3 |         1 | 2             |
|      4 |      NULL | Category - B  |
|      5 |         4 | 1             |
|      6 |         4 | 2             |
|      7 |         4 | 3             |

С помощью одного запроса и PHP превращается в:

<select>
<optgroup label="Area - A">
    <option>1</option>
    <option>2</option>
</optgroup>
<optgroup label="Area - B">
    <option>1</option>
    <option>2</option>
    <option>3</option>
</optgroup>
</select>
1
0
82
1

Ответы 1

Вам понадобится пост-обработка вашего запроса на PHP. Я предпочитаю преобразовать строки в многомерный массив:

$rows = query("SELECT * FROM table ORDER BY cat_catid"); // (Just make sure NULL's are first)

$cats = [];
foreach ( $row as $row ) {
    // Do we have a root category?
    if ( $row['cat_catid'] === null ) {
        // Start a new array, and no children
        $cats[ $row['cat_id'] ] = [
            'name' => $row['cat_name'],
            'children' => []
        ];
    } else {
        // Add this category name to the parent category ID.
        $cats[ $row['cat_catid'] ]['children'][] = $row['cat_name'];
    }
}

echo '<select>';

foreach ( $cats as $cat ) {
    echo '<optgroup label="', $cat['name'], '">';
    foreach ( $cat['children'] as $child ) {
        echo '<option>', $child, '</option>';
    }
    echo '</optgroup>';
}

echo '</select>';

Спасибо, но хотелось бы узнать, можно ли обойтись без многомерного массива.

NAG 13.09.2018 23:03

@NAG Почему, что ты рассуждаешь? Без этого код становится намного уродливее.

Goodbye StackExchange 14.09.2018 03:16

@NAG При дальнейшем осмотре я не думаю, что это возможно. Данные прямо сейчас из базы данных находятся в правильном порядке, => NULL 1 1 NULL 4 4 4, но когда вы удаляете / добавляете новые элементы в категории, они могут быть в другом порядке, и нет способа упорядочить их в базе данных таким образом, чтобы вы можете просто перебрать строки и проверить предыдущую.

Goodbye StackExchange 14.09.2018 12:29

Другие вопросы по теме