Create nested list from PHP array for dropdown select field

前端 未结 3 1268
無奈伤痛
無奈伤痛 2020-12-14 05:06

I am struggling with an array I want to turn into a nested < select >

I need:


                        
    
提交评论

  • 2020-12-14 05:35

    this just litle change of the original code that answered by Qeremy

    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 (isset($t['_children'])) {
                printTree($t['_children'], $r+1, $t['parent']); 
            }
        }
    }
    

    Now the dashed name works great. *sorry for my english

    0 讨论(0)
  • 2020-12-14 05:38

    Try this;

    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;
    }
    
    
    $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),
    );
    
    $tree = buildTree($rows);
    // print_r($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']);
            }
        }
    }
    
    
    print("<select>\n");
    printTree($tree);
    print("</select>");
    

    Output;

    <select>
        <option value='1'>Test 1</option>
        <option value='2'>- Test 1.1</option>
        <option value='3'>- Test 1.2</option>
        <option value='4'>-- Test 1.2.1</option>
        <option value='5'>-- Test 1.2.2</option>
        <option value='6'>--- Test 1.2.2.1</option>
        <option value='7'>Test 2</option>
        <option value='8'>- Test 2.1</option>
    </select>
    

    And in your case;

    <select>
        <option value='1'>Baden-Württemberg</option>
        <option value='2'>- DMP-Verträge</option>
        <option value='50'>- Sprechstundenbedarf</option>
        <option value='52'>- Richtgrößen</option>
        <option value='53'>- Prüfungen</option>
        <option value='54'>- DMP-Verträge</option>
        <option value='55'>- Sonstige Verträge</option>
        <option value='3'>Berlin</option>
        <option value='62'>- DMP-Verträge</option>
        <option value='63'>- Prüfungen</option>
        <option value='64'>- Richtgrößen</option>
        <option value='65'>- Sonstige Verträge</option>
        <option value='66'>- Sprechstundenbedarf</option>
        <option value='4'>Brandenburg</option>
        <option value='67'>- DMP-Verträge</option>
        <option value='68'>- Prüfungen</option>
        <option value='69'>- Richtgrößen</option>
        <option value='70'>- Sonstige Verträge</option>
        <option value='71'>- Sprechstundenbedarf</option>
        <option value='5'>Bremen</option>
        <option value='72'>- DMP-Verträge</option>
        <option value='73'>- Prüfungen</option>
        <option value='74'>- Richtgrößen</option>
        <option value='75'>- Sonstige Verträge</option>
        <option value='76'>- Sprechstundenbedarf</option>
        <option value='7'>Hessen</option>
        <option value='6'>Hamburg</option>
        <option value='8'>Mecklenburg-Vorpommern</option>
        <option value='9'>Niedersachsen</option>
        <option value='10'>Nordrhein</option>
        <option value='11'>Rheinland-Pfalz</option>
        <option value='12'>Saarland</option>
        <option value='13'>Sachsen</option>
        <option value='14'>Sachsen-Anhalt</option>
        <option value='15'>Schleswig-Holstein</option>
        <option value='16'>Thüringen</option>
        <option value='17'>Westfalen-Lippe</option>
        <option value='51'>Richtgrössen</option>
        <option value='56'>Bayern</option>
        <option value='57'>- DMP-Verträge</option>
        <option value='58'>- Prüfungen</option>
        <option value='59'>- Richtgrößen</option>
        <option value='60'>- Sonstige Verträge</option>
        <option value='61'>- Sprechstundenbedarf</option>
    </select>
    
    0 讨论(0)
  • 提交回复
    热议问题