Я создаю анкету для клиента, которая требует, чтобы вопросы были организованы на 3 уровня уровней. Я успешно создал пользовательский интерфейс, однако я пытался в течение последних 3 часов извлекать данные из базы данных таким образом, чтобы все загружалось в нужном месте. База данных организована так клиентом, поэтому я не контролирую ее:
id description parentId 1 Level 1 0 2 Level 2 0 3 Level 1a 1 4 Level 1b 1 5 Level 1a1 3
Я нашел аналогичный вопрос на моем сайте, но когда я попытался его решить, я получил следующее на повторе бесконечно:
Код:
function makeList($par_id = 0) { //your sql code here $result = mysql_query("SELECT * FROM pB_test WHERE parentId = $par_id"); $pages = mysql_fetch_array( $result ); if (count($pages)) { echo '<ul>'; foreach ($pages as $page) { echo '<li>', $page['description']; makeList($page['parentId']); echo '</li>'; } echo '</ul>'; } } makeList();
Вывод:
1 3 5 5 l l 3 5 5 l l 3 5 5 l l 3 5 5 l l
Кто-нибудь знает, как это исправить и в чем проблема? ура
Сделайте это рекурсивно:
function printChildQuestions($parentid) { $sql="SELECT * FROM pB_test WHERE parentID=$parentid"; $result=mysql_query($sql); $i=0; while (true) { $row=mysql_fetch_array($result); if (!$row) break; if ($i==0) echo "<ul>"; $i=1; echo '<li>'.$row['id'].' '.$row['description'].' '.$row['parentId'].'</li>'; printChildQuestions($row['id']); } if ($i>0) echo '</ul>'; } printChildQuestions(0);
это нехорошо вызывать mysql-сервер и результат выборки каждый раз
что, если у вас более 100 строк? или 200+
используйте это для запроса только один раз:
$result = mysql_query("SELECT * FROM test"); $arrs = array(); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $arrs[] = $row; } function build_tree($arrs, $parent_id=0, $level=0) { foreach ($arrs as $arr) { if ($arr['parent_id'] == $parent_id) { echo str_repeat("-", $level)." ".$arr['name']."<br />"; build_tree($arrs, $arr['id'], $level+1); } } } build_tree($arrs);
общий пример для таблицы
id name parent_id