Как исчислить иерархическое оглавление в PHP из таблицы "родитель-потомок" (смежность)
Я пытаюсь нумеровать / создавать или генерировать оглавление в PHP из базы данных MySQL в модели дерева смежности (id, parent_id). Пока что это то, чего я достиг, отражая результаты.
1. Category 1
1 Subcategory 1
2 Subcategory 2
3 Subcategory 3
2. Category 2
1. Subcategory 1
1. Subcategory Subcategory 1
2. Subcategory Subcategory 2
2 Subcategory 2
1 Subcategory 1
2 Subcategory 2
Я очень близок, но что я хочу получить:
1. Category 1
1.1 Subcategory 1
1.2 Subcategory 2
1.3 Subcategory 3
2. Category 2
2.1. Subcategory 1
2.1.1. Subcategory Subcategory 1
2.1.2. Subcategory Subcategory 2
2.2 Subcategory 2
2.2.1 Subcategory 1
2.2.2 Subcategory 2
Другими словами, я хочу использовать формат оглавления в многоуровневой иерархической структуре следующим образом: Chapter.Subchapter.Subchapter.Subchapter TITLE.
Я попытался с помощью рекурсивного массива, который сохраняет текущий индекс и объединяет с предыдущим индексом, но что в итоге добавляет странное длинное число перед каждым элементом, например,
0,11.2..11.2.3.4.5.6.7..11..11.2.3.4.5.6 компьютеров,
когда вместо этого должно быть просто:
2.7.6 Компьютеры.
(Другие номера - номера других предметов)
Это код, над которым я работал
renumber(0,0,1,0);
function renumber($parent_id,$level=0,$counter=1) {
// Counter level keeps track of the current index number
$counterlevel[$level]=$counter;
$query = "SELECT defaultTitle, id, pid FROM defaultChapters WHERE pid=".$parent_id;
$res = mysql_query($query) or die(mysql_error());
// Exit if there are no tree leafs
if(mysql_num_rows($res) == 0) {return;}
while (list ($title, $id) = mysql_fetch_row($res))
{
$leveltext[$level][$counterlevel[$level]] = $section.".".$counterlevel[$level];
echo str_repeat("......",$level)." ".$counterlevel[$level]." ".$section." ".$title."<BR>";
// Increase the counter of the current level
$counterlevel[$level]++;
// Initialize the level counter
if(!$counterlevel[$level+1]) {
$counterlevel[$level+1] = 1;
}
// Start the function again to find children
renumber($id,$level+1,$counterlevel[$level+1]);
} // End While
}
Я просмотрел все форумы технической поддержки, включая этот, и кажется, что никто никогда не публиковал алгоритм для этого, просто нет ни одного примера кода для этого где-либо найти. Существуют сотни учебных пособий и кодов, позволяющих получить иерархическое дерево в php из базы данных mysql без нумерации, но ничего о нумерации иерархического оглавления в php.
Возможно ли это сделать с помощью SQL-запроса?
1 ответ
Я бы немного реорганизовал его и передал нумерацию до текущего вызова:
function renumber($parent_id = 0, $level = 0, $prefix = '')
{
// we don't need pid in the results
$query = "SELECT defaultTitle, id
FROM defaultChapters
WHERE pid=$parent_id";
$res = mysql_query($query) or die(mysql_error());
// Exit if there are no tree leafs
if (mysql_num_rows($res) == 0) {
return;
}
// start numbering at 1
$nr = 1;
while (list($title, $id) = mysql_fetch_row($res)) {
// dropped section, not sure where it was used
echo str_repeat("......", $level) . " $prefix.$nr $title<BR>";
// Start the function again to find children
renumber($id, $level + 1, strlen($prefix) ? "$prefix.$nr." : "$nr.");
// advance list numbering
++$nr;
}
}
renumber();