我有这两个功能:
此函数从mysql生成ul li树菜单 父母,parentid,title
while($row=mysqli_fetch_object($query)){
$data[$row->ParentId][] = $row;
}
function BuildTree($data, $parent = 0) {
static $i = 1;
//$tab = str_repeat('-', $i);
if ($data[$parent]) {
$html .= "\n<ul" . ($parent == 0 ? ' class="tree"' : '') . ">\n";
$i++;
foreach ($data[$parent] as $v) {
$child = BuildTree($data, $v->Parent);
$html .= "<li>";
$html .= '<span>' . $v->Title . "</span>";
if ($child) {
$i–;
$html .= $child;
}
$html .= "</li>\n";
}
$html .= "</ul>\n";
return $html;
} else {
return false;
}
}
echo (BuildTree($data));
它生成一个菜单,如:
类别A
-Aubcategory类别A
- 子类别A的子类别A.
B类
......无限...
并且此函数获取数组的键
function GetKeys($array, $tree = array()) {
foreach ($array as $key => $value) {
if (is_array($value)) {
GetKeys($value, array_merge($tree, array($key)));
} else {
print implode('.', array_merge($tree, array($key, $value)));
print "\n<br />";
}
}
}
GetKeys($data);
它获得了像
这样的键 0
01
001
020
对于菜单的每个孩子
但我不知道如何合并它以获得类似的东西:
A类[0]
-Aubcategory类别A [00]
- 子类别A的子类别A [000]
- 类别A的子类别B [001]
B类1
无限...
有人可以帮我解决这个问题吗?
$ data的$ var_dump得到:
解决方案:
function BuildTree($data, $parent = 0, $k=false) {
static $i = 1;
if ($data[$parent]) {
$html .= "\n<ul" . ($parent == 0 ? ' class="tree"' : '') . ">\n";
$i++;
foreach ($data[$parent] as $key => $v) {
$child = BuildTree($data, $v->Parent, $k.$key);
$html .= "<li>[" . $k.$key . ']';
$html .= '<span>' . $v->Title . "</span>";
if ($child) {
$i–;
$html .= $child;
}
$html .= "</li>\n";
}
$html .= "</ul>\n";
return $html;
} else {
return false;
}
}
echo (BuildTree($data));
帮助它的人:
的断路器
Amr Berag
谢谢!
答案 0 :(得分:0)
修改您的Getkeys函数以返回已排序的键数组,然后将其设置为全局并从BuildTree()函数访问它,并且每次在关闭li之前添加键中的第一个元素并立即使用unset将其删除。这个概念是将树视为线性的东西。这是我的尝试:
$g_keys = array();
function GetKeys($array, $tree = array()) {
global $g_keys;//global
foreach ($array as $key => $value) {
if (is_array($value)) {
GetKeys($value, array_merge($tree, array($key)));
} else {
$k = implode('.', array_merge($tree, array($key, $value)));
$g_keys[]=$k;
}
}
}
function BuildTree($data, $parent = 0) {
global $g_keys;//global
static $i = 1;
//$tab = str_repeat('-', $i);
if ($data[$parent]) {
$html .= "\n<ul" . ($parent == 0 ? ' class="tree"' : '') . ">\n";
$i++;
foreach ($data[$parent] as $v) {
$child = BuildTree($data, $v->Parent);
$html .= "<li>";
$html .= '<span>' . $v->Title . "</span>";
if ($child) {
$i–;
$html .= $child;
}
$html .="[".array_shift($g_keys)."]</li>\n";
}
$html .= "</ul>\n";
return $html;
} else {
return false;
}
}
//Now use it
GetKeys($data);// $g_keys is a global that can be accessed from both functions now
echo (BuildTree($data));
.............................
<强> array_shift()强>
这是我第一次使用此功能。这就是文档讲述的内容。(如果它不起作用,请尝试手动完成)
array_shift()关闭数组的第一个值并返回它, 将数组缩短一个元素并将所有内容向下移动。所有 数字数组键将被修改为从零开始计数 而文字键不会被触及。