大家好, 我想弄清楚这个想法有点烦躁,已经好几个小时了。感谢您的帮助!
我有一组类别及其孩子,可以深入7或8层。 IE:
---(1)我的类别
------(2)市场营销(1个孩子)
------(3)HR(1个孩子)
--------(4)职位(3个孩子)
-----------(6)临时工(4个孩子)
-----------------(8)New Temp Jobs(6个孩子)
-----------(7)全职(4个孩子)
-----(5)操作(1的子项)
在数据库中,每个文件夹都有一个parent_ID,如上所示。当我通过查询遍历这些文件夹时,是否有一种方法可以继续循环以获取孩子,并继续检查孩子的孩子,依此类推,直到停止,然后再移至下一个被保留的父对象? >
现在我有类似的东西:
foreach ($firstlevel as $folderid){
echo folder_name($folderid);
$children=children($folderid);////gets the children in an array
foreach ($children as $childid){
但是,显然,这只会检查第二级。我该如何继续为每个孩子做这些事情,然后在下一个级别进行检查以查看是否还有其他功能,如果没有,则进行下一个操作?这有可能吗?谢谢!
一些编辑: 我的第一级功能就是
$firstlevel=first_level();
function first_level(){
$query=mysqli_query(con(),"SELECT category_id from categories where parent IS NULL");
} ////it spits it out as an array, will save you the semantics
与抓取孩子的功能相同,除了
function children($folderid){
$query=mysqli_query(con(),"SELECT category_id from categories where parent='$folderid' ");
} ////it spits it out as an array as well
答案 0 :(得分:1)
您不能使用常规循环来解决场景问题,因为没有深度限制。 最好进行深度搜索。
请检查以下功能。提供一个可迭代的树,它将依次到达第一个分支的叶子,然后到达下一个分支,然后依次到达下一个分支。
您还没有提供有关所使用的数据结构类型的详细信息,因此在示例函数中,该函数用于对象数组。您可以根据您的场景将'is_array'更改为其他内容(例如-is_iterable)。
fnc_travarse($your_data_nodes);
function fnc_travarse($nodes) {
foreach ($nodes as $folderid) {
echo $folderid.'<br />';
$childs = children($folderid);
if (!empty($childs) && is_array($childs)) fnc_travarse($childs);
}
}
答案 1 :(得分:1)
这是视频-https://www.youtube.com/watch?v=CzjHx_6eRyI 这是相同的代码。
<?php
$db = new mysqli("localhost","root","","test");
// check connection
if($db->connect_error) {
die("Connection failed! " . $db->connect_error);
}
function categoryTree($parent_id=0, $submark='') {
global $db;
$query = $db->query("SELECT * FROM categories WHERE parent_id=$parent_id ORDER BY catname ASC");
if($query->num_rows >0) {
while($row=$query->fetch_assoc()) {
echo $row['id'] . " $submark " . $row['catname'] . " <br/>";
categoryTree($row['id'],$submark." >> ");
}
}
}
echo categoryTree();
?>
数据库表-
CREATE TABLE IF NOT EXISTS `categories` (
`id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` tinyint(3) unsigned NOT NULL,
`catname` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
--
-- Dumping data for table `categories`
--
INSERT INTO `categories` (`id`, `parent_id`, `catname`) VALUES
(1, 0, 'My Categories'),
(2, 1, 'Marketing'),
(3, 1, 'HR'),
(4, 3, 'Job Positions'),
(5, 1, 'Operations'),
(6, 4, 'Temp Jobs'),
(7, 6, 'New Temp Jobs'),
(8, 4, 'Full Time Jobs');