Структура страниц PHP в массив - PullRequest
0 голосов
/ 10 сентября 2010

Окей, так это моя проблема.У меня есть структура страницы, сохраненная в MySQL базы данных.Например:

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
Страница 3

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

Пример: Страница 1 имеет «url» page-1, а «childof» пуста
SubPage 1.1 имеет «url» subpage-1-1 и "childof" page-1
SubPage 1.1.1 имеют "url" subpage-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++;
 }
}

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

Спасибо!

Ответы [ 3 ]

1 голос
/ 10 сентября 2010

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

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

0 голосов
/ 10 сентября 2010

Отредактируйте свою таблицу, сделайте новое поле с именем subcat как INT 1 = правда 0 = ложь

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

0 голосов
/ 10 сентября 2010

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

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);
        }
    }
...