Я пытаюсь поработать с 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/')
Пожалуйста, предложите, как получить этот вывод с элементами базы данных …
Спасибо.
Там должны быть некоторые корректировки, но я надеюсь, что это даст вам преимущество
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);
}
}
Это помогает?
Других решений пока нет …