我有一个这样的主题表:
id
title
parent_id
full_path
full_path
用于查找父项为递归。像这样:
+----+-----------+-----------+-----------+
| id | title | full_path | parent_id |
+----+-----------+-----------+-----------+
| 40 | home | 40 | 0 |
| 41 | myhome1 | 41 | 0 |
| 42 | **** | 40-42 | 40 |
| 43 | ***** | 41-43 | 41 |
| 44 | *** | 44 | 0 |
| 45 | **** | 45 | 0 |
| 46 | ***** | 46 | 0 |
| 49 | ****** | 49 | 0 |
| 50 | **** ** | 40-42-50 | 42 |
| 51 | **** ** | 40-42-51 | 42 |
| 52 | **** ** | 40-42-52 | 42 |
| 53 | ******* | 40-53 | 40 |
| 54 | **** | 40-54 | 40 |
| 55 | *** | 41-55 | 41 |
| 56 | **** **** | 40-42-56 | 42 |
| 57 | ******* | 44-57 | 44 |
+----+-----------+-----------+-----------+
我如何得到这样的递归数组:
array
(
40 => array
(
42 => array
(
50,51,52,etc.
),
53,
54
)
41 => array
(
43,
55,
),
44 => array
(
57,
),
etc...
)
我可以使用full_path
创建多级菜单吗?
答案 0 :(得分:3)
您可以使用以下代码执行此操作。请记住,这是有效的,因为您的主题数组将非常小,并且发生的递归将是最小的。不要在大型阵列上使用这种方法。
<?php
$query = "SELECT id, parent_id FROM subjects";
//execute with your prefered method, eg mysqli
$rows = array();
while($row = $result->fetch_array(MYSQLI_ASSOC))
{
$rows[] = $row;
}
function getChildren($p) {
global $rows;
$r = array();
foreach($rows as $row) {
if ($row['parent_id']==$p) {
$r[$row['id']] = getChildren($row['id']);
}
}
return $r;
}
$final = getChildren(0);
?>
答案 1 :(得分:3)
我编辑了Hugo的代码:
MySQL的代码:sqlfiddle
我们这样的表:
ID | Categories_name | Parent_id
我们的数据是(图片上的数字,显示ID类别):
我们的PHP代码:
<?php
$db=mysql_connect("127.0.0.1","root","");
$db_name = "test";
mysql_select_db($db_name,$db);
$query = "SELECT `id`,`cat_name`,`parent_id` FROM `categories`";
$result=mysql_query($query);
$num=mysql_num_rows($result);
$level_each_rows = array();
$rows = array();
for($i = 0 ; $i < $num ; $i++)
{
$q_data = mysql_fetch_array($result);
$rows[] = $q_data;
}
function getChildren_string($p)
{
global $rows;
global $level_each_rows;
$r = array();
$i = 0;
$return = '';
foreach($rows as $row)
{
if ($row['parent_id'] == $p)
{
if($row['parent_id'] == 0)
{
$level_each_rows[$row['id']]['i'] = 0;
}
else
{
$level_each_rows[$row['id']]['i'] = $level_each_rows[$row['parent_id']]['i'] + 1;
}
$return = $return.'
<tr>
<td>'.$row['parent_id'].'</td>
<td><div style="margin:0px '.($level_each_rows[$row['id']]['i'] * 35).'px;">['.$row['id'].'] - '.$row['cat_name'].'</div></td>
</tr>
';
$return = $return.getChildren_string($row['id']);
$i++;
}
}
//---
return $return;
}
$childs = getChildren_string(0);
echo '
<div dir="ltr">
<table dir="ltr" border="1">
<tr>
<td>Parent ID</td>
<td>Child ID</td>
</tr>
';
echo $childs;
echo '
</table>
</div>
';
?>
<强>结果:强>