2013-08-15 2 views
0

Моя проблема очень похожа на описанную здесь, в этой теме Create nested list from PHP array for dropdown select field Проблема заключается в том, что если инвестиции являются не последовательными, то неправильно добавляет тиреКак создать вложенный список из массива 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), 
); 

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

ответ

1

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

Да, но меня интересует, как изменить функцию для работы с моим массивом. – Dima

+0

Вы не сказали, как вы ожидаете, что ваш массив будет работать, и не показал образец вашего желаемого результата. – lsouza

Смежные вопросы