Okey, так что это моя проблема. У меня есть структура страницы, сохраненная в mysql db. Вот так:
Page 1
- SubPage 1.1
- - SubPage 1.1.1
- - - SubPage 1.1.1.1
- - - SubPage 1.1.1.2
- - SubPage 1.1.2
- SubPage 1.2
- SubPage 1.3
Страница 2
Page 3
Структура может иметь бесконечные страницы и вспомогательные страницы. На всех страницах есть поле "url" и "childof" . "childof" - это то, что связывает страницу как подстраницу другого.
Пример:
Страница 1 имеет "url" page-1 и "childof" пуст
SubPage 1.1 имеет подстраницу url-1-1 и "childof" page-1
SubPage 1.1.1 имеет подстраницу "url" -1-1-1 и "childof" subpage-1-1
Надеюсь, вы получите основную идею.
Моя проблема состоит в том, чтобы создать цикл для вывода всех этих страниц в один хороший массив.
Получить первую строку страниц легко,
$sql = "SELECT * FROM `page` WHERE `childof` = ''
ORDER BY `id` DESC";
$result = mysql_query($sql);
$i=0;
while ($row = mysql_fetch_assoc($result)) {
$pages[$i]['id'] = $row['id'];
$i++;
}
Получить вторую строку легко, а...
for($x=0; $x < sizeof($pages); $x++){
$sql = "SELECT * FROM `page` WHERE `childof` = '".$pages[$x]['url']."'
ORDER BY `id` DESC";
$result = mysql_query($sql);
$i=0;
while ($row = mysql_fetch_assoc($result)) {
$pages[$x]['children'][$i]['id'] = $row['id'];
$i++;
}
}
И, конечно, я мог бы продолжать так. Но делать это, не зная, сколько подстраниц есть, не очень эффективно. Итак, как мне сделать цикл для извлечения всех страниц и подстраниц в массив с хорошей структурой?
Спасибо!
Первым решением будет использование рекурсии для извлечения детей каждой страницы. Но это может привести к огромному количеству запросов, когда количество страниц станет большим, особенно если они глубоко вложены.
Возможно, вы захотите посмотреть этот блог-запись, чтобы получить все страницы с одним запросом, а затем использовать карту для доступа к детям определенной страницы.
Вы хотите использовать рекурсию для решения этой проблемы, вот какой-то пример кода того, что я сделал недавно, чтобы решить аналогичную задачу.
function retrieveFolderChildren($iRoot, &$aChildren, $cMysql)
{
if($cStatement = $cMysql->prepare("SELECT folderName, id FROM dir_structure WHERE rootId=? ORDER BY folderName"))
{
$cStatement->bind_param('i', $iRoot);
$cStatement->execute();
$cStatement->bind_result($sFolderName, $iId);
while ($cStatement->fetch())
{
$aChildren[] = array( "folderName" => $sFolderName, "id" => $iId, "children" => array());
}
$cStatement->close();
}
foreach ($aChildren as &$aChild)
{
retrieveFolderChildren($aChild["id"], $aChild["children"], $cMysql);
}
}
Измените таблицу, создайте новое поле подкатегория как INT 1 = true 0 = false
Создайте ifstatement, чтобы искать значение, если да, перейдите в цикл while else, ничего не делайте, я думаю?