Структура страниц PHP в массив

0

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++;
 }
}

И, конечно, я мог бы продолжать так. Но делать это, не зная, сколько подстраниц есть, не очень эффективно. Итак, как мне сделать цикл для извлечения всех страниц и подстраниц в массив с хорошей структурой?

Спасибо!

Теги:
arrays
data-structures

3 ответа

1
Лучший ответ

Первым решением будет использование рекурсии для извлечения детей каждой страницы. Но это может привести к огромному количеству запросов, когда количество страниц станет большим, особенно если они глубоко вложены.

Возможно, вы захотите посмотреть этот блог-запись, чтобы получить все страницы с одним запросом, а затем использовать карту для доступа к детям определенной страницы.

  • 0
    Хм, хорошая ссылка. Кажется, мне нужно переосмыслить мою идею о сохранении его в порядке в массиве. Я просто понял, что это только продвинет проблему вперед. Я думаю, что это подойдет .. Спасибо.
  • 0
    Я хотел бы добавить, что использование рекурсии не является неправильным. Он напрямую отражает структуру, как она хранится в базе данных. Просто вы не можете (я считаю, что есть исключения) рекурсивно получить остальное одним запросом.
0

Вы хотите использовать рекурсию для решения этой проблемы, вот какой-то пример кода того, что я сделал недавно, чтобы решить аналогичную задачу.

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);
        }
    }
  • 0
    Я тоже так понял. Но у меня все еще есть проблема с выяснением, чтобы сделать это. Как даже начать. Моя самая большая проблема заключается в том, как структурировать массив на лету. Я хочу, чтобы массив выглядел примерно так, когда все готово; $ страницы [0] [дети] [0] [дети] [0] [ 'ID']. Это будет подстраница уровня 3.
0

Измените таблицу, создайте новое поле подкатегория как INT 1 = true 0 = false

Создайте ifstatement, чтобы искать значение, если да, перейдите в цикл while else, ничего не делайте, я думаю?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню