有人可以帮我合并这两个php函数吗?

时间:2018-06-07 22:07:26

标签: php mysql mysqli

我有这两个功能:

此函数从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得到:

array structure

complete code

解决方案:

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

谢谢!

1 个答案:

答案 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()关闭数组的第一个值并返回它,   将数组缩短一个元素并将所有内容向下移动。所有   数字数组键将被修改为从零开始计数   而文字键不会被触及。