Как создать вложенный список из массива PHP для выпадающего списка?

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

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), ); 

Как я могу его изменить? Извините за мой английский

Это не работает, потому что вы не устанавливаете атрибут «родительский» правильно. Даже если имя «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), ); 

Я просто решил вашу проблему здесь на SO в другом вопросе

просто замените ++$r на $r+1

«тире» теперь отлично работает.