【问题标题】:Array "tree" creation from db table从数据库表创建数组“树”
【发布时间】:2011-11-22 01:30:16
【问题描述】:

我的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();
}

从 db 表中生成以下数组。 [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;
}

数据库结构

【问题讨论】:

标签: php mysql arrays tree hierarchical-data


【解决方案1】:

函数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 具有正确性,this anwser 是您所需要的。

【讨论】:

    【解决方案2】:

    您只向array_key_exists() 传递了一个参数。我想您可能想使用isset() 来查看该元素是否存在于数组中。

    array_key_exists($id, $tree[$parent]['children']);
    

    应该大致相当于:

    isset($tree[$parent]['children'][$id]);
    

    【讨论】:

    • 我知道,但是我怎样才能修改这个函数来让它工作,这不是我的函数所以问
    • 收到Undefined offset: 0,1,2 on line list($id, $parent, $name) = $results; 错误
    【解决方案3】:

    我在我的回答中发布了将像您这样的数组转换为多维数组的代码:

    棘手的部分是理解 PHP 参考。我仍然不确定我是否理解它们,但我发布的代码是唯一可行的方法。

    【讨论】:

    • 我已经看过你的代码了。有两个问题:1)我的数组结构有点不同 2)你说“算法只有在父母出现在他们的孩子出现之前出现在 db 结果集中时才有效。”请帮我让它工作。我不明白树部分的生成
    猜你喜欢
    • 2012-05-15
    • 2011-05-10
    • 1970-01-01
    • 2016-08-08
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多