Ну, насколько я вижу, у вас есть два варианта, оба хорошо известны.
1) Вы делаете рекурсивную функцию, только те, которые вы пытались. Их много, и я не стану его здесь.
2) Безусловно, мой любимый, это образец базы данных, самый современный способ использования ORM, он называется вложенной моделью набора.
В принципе вы создать несколько столбцов на столе, он должен выглядеть как этот:
CREATE TABLE nested_category (
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
lft INT NOT NULL,
rgt INT NOT NULL
);
INSERT INTO nested_category VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),
(4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),
(9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);
SELECT * FROM nested_category ORDER BY category_id;
+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
+-------------+----------------------+-----+-----+
Если вы заметили, что нет колонки parent_id. Чтобы иметь возможность искать его для детей, допустим, строка 5 будет выглядеть так:
Select * from nested_category where left > 7 and left < 8 order by left asc,
что не принесет никаких результатов.
Для ряда номер 1 результат, однако, принесет все дерево.
У меня нет сценария php для автосоздания этих столбцов на этом компьютере, но их много. Я боюсь, что они также рекурсивны.
Вы мои найти много информации вокруг поиска для «вложенных множеств модели», как this или theorical exaplanations модели like this one
И ЭТО ПУТЬ дублируется ВОПРОС (я не могу поставить его как дублируется)
Некоторые другие ответы:
Вы должны перечитать правила форума, прежде чем отправлять, искать уже заданные вопросы.
Надеюсь, это поможет.