Create nested list from PHP array for dropdown select field Create nested list from PHP array for dropdown select field php php

Create nested list from PHP array for dropdown select field


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>


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


In Qeremy's code just change this line and the code will not be giving you any incrementing dashes

$t['parent'] == $p

to ->

$t['parent'] == 0