从数据库表创建数组“树”的方法

3

我的PHP函数

function generateMenu($parent, $level, $menu, $utype) {
    global $db;
    $tree = array();
    $stmt = $db->prepare("select id, parent, name FROM navigation WHERE menu=? AND user_type=?") or die($db->error);
    $stmt->bind_param("ii", $menu, $utype) or die($stmt->error);
    $stmt->execute() or die($stmt->error);
    $stmt->store_result();
    $meta = $stmt->result_metadata();
    $stmt->bind_result($id, $parent, $name);
    while ($stmt->fetch()) {
        $arr[$id] = array(
            'name' => $name, 
            'parent' => $parent
        );
        if (!array_key_exists($parent,$arr) and $parent != 0) {
            $arr[$parent][$id] = $id;
        }
    }
    $stmt->close();
}

从数据库表中生成以下数组。[1],[2] ... - 是li项目的ID。
Array (
    [1] => Array ( 
        [name] => Parent1
        [parent] => 0
    ) 
    [2] => Array ( 
        [name] => Parent2
        [parent] => 0 
    )
    [3] => Array (
        [name] => Parent3 
        [parent] => 0 
    )
    [4] => Array ( 
        [name] => Child1 of P1
        [parent] => 1
    ) 
    [5] => Array (
        [name] => Child2 of P1
        [parent] => 1
    ) 
)

我希望你能够帮我创建像这样的菜单。
<ul>
  <li><a href="?page=1">Parent1</a>
    <ul>
      <li><a href="?page=4">Child1 of P1</a></li>
        ...

第二个功能是从这个数组生成菜单。但在将此数组发送到第二个函数之前,我知道需要将其转换为多维树形数组。我无法想出如何做到这一点。
以下是第二个函数:
function olLiTree($tree) {
    $out = '<ul>';

    foreach($tree as $key => $value) {
        $out.= '<li>';

        if (is_array($value)) {
            $out.= $key . olLiTree($value);
        } else {
            $out.= $value;
        }

        $out.= '</li>';
    }

    $out.= '</ul>';

    return $out;
}

数据库结构

http://img338.imageshack.us/img338/4669/6df2a8e6c7684c8aaa82ddf.png


可能是PHP函数问题的重复。 - gen_Eric
顺便说一下,我会选择第一个答案,使用递归和两个单独的函数,一个用于生成多维数组(总是有用的),另一个用于生成您的HTML。 - jeroen
3个回答

2
你只向 array_key_exists() 函数传递了一个参数。我认为你可能想使用 isset() 来判断该元素是否存在于数组中。
array_key_exists($id, $tree[$parent]['children']);

应该大致相当于:
isset($tree[$parent]['children'][$id]);

我知道,但是我该如何修改这个函数才能让它工作,那不是我的函数,所以我在问。 - Tural Ali
list($id, $parent, $name) = $results; 行处出现了“未定义偏移量:0、1、2”的错误。 - Tural Ali

2

函数array_key_exists()需要两个参数,你只传递了一个。我认为你的意思是:

while(list($id, $parent, $name) = mysql_fetch_assoc($results)) {
    $tree[$id] = array(
        'name' => $name, 
        'children' => array(), 
        'parent' => $parent
    );
    if (!array_key_exists($parent,$tree)) {
        $tree[$parent]['children'][$id] = $id;
    }
}

你更改了答案,所以我认为你的问题不在于 array_keys_exists。无论如何,你可以尝试使用以下方法从 MaxDB 中获取数据:

function generateMenu($parent, $level, $menu, $utype) {
    global $db;
    $tree = array();
    $stmt = $db->prepare("select id, parent, name FROM navigation WHERE menu=? AND user_type=?") or die($db->error);
    $stmt->bind_param("ii", $menu, $utype) or die($stmt->error);
    $stmt->execute() or die($stmt->error);
    $stmt->store_result();
    $meta = $stmt->result_metadata();

    $stmt->bind_result($id, $parent, $name);
    while ($stmt->fetch()) {
        $tree[$id] = array(
            'name' => $name, 
            'children' => array(), 
            'parent' => $parent
        );
        if (!array_key_exists($parent,$tree)) {
            $tree[$parent]['children'][$id] = $id;
        }
    }
    $stmt->close();
    print_r($tree);
}

对于您的第二个函数,我认为@jeroen是正确的,在这个答案中有您需要的内容。


0

我在回答中发布了将类似于您的数组转换为多维数组的代码:

棘手的部分是理解 PHP 引用。我仍然不确定我是否理解它们,但我发布的代码是唯一能够工作的方式。


我已经查看了你的代码,有两个问题:1)我的数组结构有点不同;2)你说“算法只有在父项出现在数据库结果集中其子项之前时才能工作。”请帮助我使其正常工作。我不理解生成树部分。 - Tural Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接