Создание массива "дерево" из таблицы БД - PullRequest
3 голосов
/ 22 ноября 2011

Моя функция 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 item

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

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Функция 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 есть правильное значение, в этот ответ - это то, что вам нужно.

2 голосов
/ 22 ноября 2011

Вы только передали один параметр array_key_exists().Я думаю, что вы можете использовать isset(), чтобы увидеть, существует ли этот элемент в массиве.

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

Должно быть примерно равно:

isset($tree[$parent]['children'][$id]);
0 голосов
/ 25 ноября 2011

Я отправил код для преобразования массива, подобного вашему, в многомерный массив в своем ответе:

Сложнее понять ссылки на PHP. Я до сих пор не уверен, что понимаю их, но размещенный мною код - единственный способ, которым он будет работать.

...