所以,我试图打印我的课程:
class category {
public $name;
public $id;
public $subCats = array();
public function __construct($name = "", $id = "") {
$this->name = $name;
$this->id = $id;
}
public function add_sub_cat($subCat) {
array_push($this->subCats, $subCat);
}
}
以递归和迭代两种方式,首先我没有遇到任何问题:
function recursive_print($category, $path) {
?>
<li><div id="category-name" ><p><? echo $category->name ?></p>
</div></li>
<?php foreach($category->subCats as $subCat) { ?>
<ul>
<?php recursive_print($subCat, $path.=$subCat->id) ?>
</ul>
<?php }
}
但现在我被困在这项任务的第二部分。 我必须修改我的班级吗? 甚至可以在没有递归的情况下打印吗? 我读过this但它没有清除任何内容。 也许有人有更好的教程或任何建议?
答案 0 :(得分:1)
在没有递归的情况下走树是一个有趣的问题。
基本思路是你需要自己跟踪堆栈。 (函数调用是通过在调用之前将临时变量和返回地址压入堆栈,然后弹出返回地址来实现的,所以当你做一个递归函数时,你自己就不必自己做了。)
这是一个非递归实现:
function tree_print($root_category) {
$stack = array(array($root_category));
echo '<ul>'."\n";
while (count($stack)) {
$category = array_shift($stack[count($stack)-1]);
echo '<li><div id="category-name"><p>' . $category->name . '</p></div></li>'."\n";
echo '<ul>'."\n";
$stack[] = $category->subCats;
while (count($stack) && count($stack[count($stack)-1]) == 0) {
echo '</ul>'."\n";
array_pop($stack);
}
}
}
在主循环的每次迭代中,我们将第一个树节点从堆栈顶部的数组中移出,打印它,打开一个<ul>
标记,并将其所有子节点的数组推送到堆栈节点。然后,我们从堆栈顶部删除任何空数组,为每个这样的空数组关闭一个<ul>
标记。
看到它在这里运行:https://3v4l.org/umpvf