【问题标题】:How to create nested list from PHP array for dropdown select field?如何从 PHP 数组为下拉选择字段创建嵌套列表?
【发布时间】:2013-08-15 12:21:55
【问题描述】:

我的问题与本主题Create nested list from PHP array for dropdown select field中描述的问题非常相似,问题是如果投资不连续,则错误地添加破折号

function buildTree(Array $data, $parent = 0) {
    $tree = array();
    foreach ($data as $d) {
        if ($d['parent'] == $parent) {
            $children = buildTree($data, $d['id']);
            // set a trivial key
            if (!empty($children)) {
                $d['_children'] = $children;
            }
            $tree[] = $d;
        }
    }
    return $tree;
}

function printTree($tree, $r = 0, $p = null) {
    foreach ($tree as $i => $t) {
        $dash = ($t['parent'] == 0) ? '' : str_repeat('-', $r) .' ';
        printf("\t<option value='%d'>%s%s</option>\n", $t['id'], $dash, $t['name']);
        if ($t['parent'] == $p) {
            // reset $r
            $r = 0;
        }
        if (isset($t['_children'])) {
            printTree($t['_children'], ++$r, $t['parent']);
        }
    }
}

这个解决方案适用于这样的结构数组

$rows = array(
    array ('id' => 1, 'name' => 'Test 1', 'parent' => 0),
    array ('id' => 2, 'name' => 'Test 1.1', 'parent' => 1),
    array ('id' => 3, 'name' => 'Test 1.2', 'parent' => 1),
    array ('id' => 4, 'name' => 'Test 1.2.1', 'parent' => 3),
    array ('id' => 5, 'name' => 'Test 1.2.2', 'parent' => 3),
    array ('id' => 6, 'name' => 'Test 1.2.2.1', 'parent' => 5),
    array ('id' => 7, 'name' => 'Test 2', 'parent' => 0),
    array ('id' => 8, 'name' => 'Test 2.1', 'parent' => 7),
);

但不适用于此

$rows = array(
    array ('id' => 1, 'name' => 'Test 1', 'parent' => 0),
    array ('id' => 2, 'name' => 'Test 1.1', 'parent' => 1),
    array ('id' => 3, 'name' => 'Test 1.2', 'parent' => 1),
    array ('id' => 4, 'name' => 'Test 1.2.1', 'parent' => 3),
    array ('id' => 5, 'name' => 'Test 1.2.2', 'parent' => 3),
    array ('id' => 6, 'name' => 'Test 1.2.2.1', 'parent' => 5),
    array ('id' => 7, 'name' => 'Test 2', 'parent' => 0),
    array ('id' => 8, 'name' => 'Test 2.1', 'parent' => 1),
    array ('id' => 9, 'name' => 'another data', 'parent' => 1),
);

我怎样才能改变它?对不起我的英语

【问题讨论】:

    标签: php list nested


    【解决方案1】:

    它不起作用,因为您没有正确设置“父”属性。即使名称是“Test 2.1”,使用此算法,您也必须设置父索引。如果您将数组更改为此,它将起作用:

    $rows = array(
        array ('id' => 1, 'name' => 'Test 1', 'parent' => 0),
        array ('id' => 2, 'name' => 'Test 1.1', 'parent' => 1),
        array ('id' => 3, 'name' => 'Test 1.2', 'parent' => 1),
        array ('id' => 4, 'name' => 'Test 1.2.1', 'parent' => 3),
        array ('id' => 5, 'name' => 'Test 1.2.2', 'parent' => 3),
        array ('id' => 6, 'name' => 'Test 1.2.2.1', 'parent' => 5),
        array ('id' => 7, 'name' => 'Test 2', 'parent' => 0),
        array ('id' => 8, 'name' => 'Test 2.1', 'parent' => 7),
        array ('id' => 9, 'name' => 'another data with no parent', 'parent' => 0),
    );
    

    【讨论】:

    • 是的,但我对如何更改函数以使用我的数组感兴趣。
    • 你没有说你期望你的阵列如何工作,也没有显示你想要的输出样本。
    【解决方案2】:

    我刚刚解决了你的问题here on SO in another question

    只需将++$r 替换为$r+1

    “破折号”现在效果很好。

    【讨论】:

      猜你喜欢
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2021-04-25
      相关资源
      最近更新 更多