كيفية طباعة القائمة باستخدام هيكل البيانات الهرمية؟
سؤال
عندما أقوم بتشغيل هذا الرمز:
foreach ($tree as $node) {
echo str_repeat(' ', $node->tree_depth * 4) . $node->id . PHP_EOL;
}
أحصل على نص منسق جيدا مثل:
Food
Fruit
Red
Cherry
Strawberry
Cool
Not cool
Yellow
Banana
Meat
Beef
Pork
لكنني أريد إنشاء قائمة مع <ul><li>...
:
حاولت مع:
echo '<ul>';
$prev_depth = 0;
foreach($table->fetchTree() as $row) {
if ($row->tree_depth > $prev_depth) {
echo '<li><ul>';
} else if ($row->tree_depth < $prev_depth) {
echo '</li></ul>';
}
echo '<li>' . $row->name . '</li>';
$prev_depth = $row->tree_depth;
}
echo '</ul>';
ولكن لدي بعض علامات UL إضافية وهلم جرا. لقد فقدت يومين على هذا إذا كنت تستطيع مساعدتي الرجاء نشر هنا ...
المحلول
جرب هذه الخوارزمية:
$tree = array(
array('Food', 0),
array('Fruit', 1),
array('Red', 2),
array('Cherry', 3),
array('Strawberry', 3),
array('Cool', 4),
array('Not cool', 4),
array('Yellow', 2),
array('Banana', 3),
array('Meat', 0),
array('Beef', 1),
array('Pork', 1),
);
$depth = -1;
$flag = false;
foreach ($tree as $row) {
while ($row[1] > $depth) {
echo "<ul>\n", "<li>";
$flag = false;
$depth++;
}
while ($row[1] < $depth) {
echo "</li>\n", "</ul>\n";
$depth--;
}
if ($flag) {
echo "</li>\n", "<li>";
$flag = false;
}
echo $row[0];
$flag = true;
}
while ($depth-- > -1) {
echo "</li>\n", "</ul>\n";
}
هنا تحتاج فقط إلى استبدال $tree
بواسطة $table->fetchTree()
, $row[0]
بواسطة $row->name
و $row[1]
بواسطة $row->tree_depth
.
نصائح أخرى
جرب هذا الرمز بدلا من ذلك:
<?php
echo "<ul>\n";
$tree = array(
array('Food', 0),
array('Fruit', 1),
array('Red', 5),
array('Cherry', 3),
array('Strawberry', 3),
array('Cool', 4),
array('Not cool', 4),
array('Yellow', 2),
array('Banana', 3),
array('Meat', 0),
array('Beef', 4),
array('Pork', 2),
);
$depth = 0;
foreach ($tree as $node) {
if ($node[1] > $depth)
echo str_repeat("<ul>\n", $node[1] - $depth);
if ($node[1] < $depth)
echo str_repeat("</ul>\n", $depth - $node[1]);
$depth = $node[1];
echo "<li>" . $node[0] . "\n";
}
echo str_repeat("</ul>\n", $depth+1);
?>
لقد قمت بتحديثها لإخراج أقل <li>
العلامات، وبالتالي تقليل عدد الرصاصات الرصاصة. ولكن من ناحية أخرى، سيولد هذا HTML الذي لن يتحقق من صحةه منذ قفزة لأكثر من مستوى واحد يؤدي إلى <ul><ul>
يجري تولدها.
لا تنتمي إلى StackOverflow