база данных — PHP Menu: какой цикл использовать для родительских элементов

Я пытаюсь поработать с PHP и создать меню PHP, которое использует элементы, хранящиеся в базе данных, и код PHP для построения пунктов меню в правильном порядке. Значения в базе данных могут быть изменены, поэтому я хочу сохранить сначала экспортированные родительские элементы, а затем вложенные элементы, добавленные ниже.

Я хочу использовать цикл (do-while? Я предполагаю), чтобы получить данные из базы данных, чтобы я мог правильно расположить меню с вложенными элементами и вывести с классом, который я хочу использовать.

Моя таблица базы данных хранит заголовок и URL для каждого элемента, а вложенные элементы содержат идентификатор родительских элементов, родительские элементы имеют идентификатор 0, установленный в качестве родительского, и это выглядит так:

--------------------
| id     | int(11) |
--------------------
| title  | varchar |
--------------------
| url    | varchar |
--------------------
| parent | int(11) |
--------------------

Вот мой PHP-код:

try {
$stm = $db->prepare('SELECT * FROM menu');
$stm->execute();
$result = $stmt->fetchAll();

// requested loop / function

}

Вывод должен выглядеть так:

$menu = menu::create()
->add('Homepage', '/', menu::create()
->add('Item1', '/item1/', menu::create()
->add('Subitem1', '/subitem1/')
->add('Subitem1', '/subitem1/')
->add('Item2', '/item2/', menu::create()
->add('Subitem3', '/subitem3/')
->add('Subitem4', '/subitem4/')

Пожалуйста, предложите, как получить этот вывод с элементами базы данных …
Спасибо.

0

Решение

Там должны быть некоторые корректировки, но я надеюсь, что это даст вам преимущество

function    sort_parent($parent)
{
$j=0;
$flag = true;
$temp=0;
while ( $flag )
{
$flag = false;
for( $j=0;  $j < count($parent)-1; $j++)
{
if ($parent[$j]->id > $parent[$j+1]->id)
{
$temp = $parent[$j]->id;
$parent[$j] = $parent[$j+1]->id;
$parent[$j+1]->id = $temp;
$flag = true;
}
}
}
return ($parent);
}

function    sort_children($children)
{
$j=0;
$flag = true;
$temp=0;
while ( $flag )
{
$flag = false;
for( $j=0;  $j < count($children)-1; $j++)
{
if ($children[$j]->parent > $children[$j+1]->parent)
{
$temp = $children[$j]->parent;
$children[$j] = $children[$j+1]->parent;
$children[$j+1]->parent = $temp;
$flag = true;
}
}
}
return ($children);
}

try {
//First we fetch the parents
$stm = $db->prepare('SELECT * FROM menu WHERE parent = 0');
$stm->execute();
$parent = $stmt->fetchAll();

// Then the childrens. Note: In some versions of SQL this operator may be written as !=
$stm = $db->prepare('SELECT * FROM menu WHERE parent <> 0');
$stm->execute();
$children = $stmt->fetchAll();
}

// We sort parent and children with a basic buble sort
$parent = sort_parent($parent);
$children = sort_object($children);

// To finish as Parent and Children are in the same order we can do that
foreach ($parent as $parent_menu_item) {
$menu = menu::create() -> add($parent_menu_item->title, $parent_menu_item->url);
for ($j=0; $children[$i]->parent == $parent_menu_item->id; j++)
{
$menu = menu::create() -> add($children[$j]->title, $children[$j]->url);
}
}

Это помогает?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]