0

我有一个代码可以在我的 html 选择框中创建一棵树我已经填充了数组并在选择框中生成树,如下所示:

$vertices = array(
    array(
        'id' => 5,
        'name' => 'Child3',
        'parent' => 2,
    ),
    array(
        'id' => 3,
        'name' => 'Child1',
        'parent' => 1,
    ),
    array(
        'id' => 4,
        'name' => 'Child2',
        'parent' => 1,
    ),
    array(
        'id' => 1,
        'name' => 'Cat1',
        'parent' => null,
    ),
    array(
        'id' => 2,
        'name' => 'Cat2',
        'parent' => null,
    ),
);

/**
 * Generate tree
 */
$subtrees = $trees = array();
foreach ($vertices as $vertex) {
    $v = array(
        'id' => $vertex['id'],
        'name' => $vertex['name'],
        'children' => array(),
    );

    if (isset($subtrees[$vertex['id']])) {
        $v['children'] = $subtrees[$vertex['id']];
    }

    if ($vertex['parent'] === null) {
        $trees[] = $v;
    }
    else if (!isset($subtrees[$vertex['parent']])) {
        $subtrees[$vertex['parent']] = array($v);
    }
    else {
        $subtrees[$vertex['parent']][] = $v;
    }
}
unset($subtrees);

/**
 * Generate HTML
 */

function getSubtreeOptions(array $subtreeRoot, $level = 0)
{
    $html = sprintf('%s<option value="%d">%s%s</option>' . PHP_EOL,
        str_repeat("\t", $level + 1),
        $subtreeRoot['id'],
        $level > 0 ? str_repeat(' ', $level) . '--' : null,
        $subtreeRoot['name']);

    foreach ($subtreeRoot['children'] as $child) {
        $html .= getSubtreeOptions($child, $level + 1);
    }

    return $html;
}

echo '<select name="stuff">' . PHP_EOL;
foreach ($trees as $root) {
    echo getSubtreeOptions($root);
}
echo '</select>';

它工作正常,但是当我想通过 mysql 查询填充数组时,它在选择框中没有显示任何内容

这是我填充数组的数据库代码:

$res = mysql_query('SELECT id, name, parent FROM groups ORDER BY parent DESC, id') or trigger_error('Query failed: ' . mysql_error(), E_USER_ERROR);
$vertices = array();
while ($vertex = mysql_fetch_assoc($res)) {
    $vertices[] = $vertex;
}

哪里有问题?

当我打印数组时。输出是:

Array
(
    [0] => Array
        (
            [id] => 4
            [name] => test
            [parent] => 3
        )

    [1] => Array
        (
            [id] => 2
            [name] => test
            [parent] => 1
        )

    [2] => Array
        (
            [id] => 3
            [name] => test
            [parent] => 1
        )

    [3] => Array
        (
            [id] => 1
            [name] => test
            [parent] => 0
        )

    [4] => Array
        (
            [id] => 5
            [name] => test
            [parent] => 0
        )

)
4

1 回答 1

0

对于那些没有子节点的节点,替换0null输入parent键,你应该没问题。$verties你的$vertices数组应该看起来像

Array
(
[0] => Array
    (
        [id] => 4
        [name] => test
        [parent] => 3
    )

[1] => Array
    (
        [id] => 2
        [name] => test
        [parent] => 1
    )

[2] => Array
    (
        [id] => 3
        [name] => test
        [parent] => 1
    )

[3] => Array
    (
        [id] => 1
        [name] => test
        [parent] => null
    )

[4] => Array
    (
        [id] => 5
        [name] => test
        [parent] => null
    )

 )

状况良好的原因

 if ($vertex['parent'] === null) {
    $trees[] = $v;
}

你反对null

于 2013-05-15T06:57:26.847 回答