2013-12-22 3 views
0

я иметь иерархическую структуру в массиве, как это:иерархическая структура в массиве, рекурсии в PHP

item root 1 
- item child 1 
-- item child 2 
item root 2 
- item child 

я хочу получить:

1. item root 1 
1-1. item child 1 
1-1-1. item child 2 
2. item root 2 
2-1. item child 

Моя функция в дереве сборки

function printTree($data, $level = 0, $counter = 1) { 

      foreach ($data as $item) { 

       if ($item['parent_id'] == 0) { 
        $addr = $counter . '. ' . $item['address']; 
        $counter++; 
       } 

       else if ($item['parent_id'] != 0) {       

        $addr = $counter . '-' . $counter . ' ' . $item['address'];     



       } else { 
        $addr = $item['address'];    
       } 

       global $result; 

       $result['aaData'][] = Array(
       $addr, 
       $item['mask'], 
       $item['status'], 
       $item['subnets'], 
       $item['therange'] = $item['start'] . ' - ' . $item['end'], 
       $item['type'], 
       $item['node'], 
       $item['id'],        
      ); 

       if (isset($item['children'])) {      
        printTree($item['children'], $level + 1, $counter + 1); 
       } 


      } 

      return $result;   
     } 

Но мой результат неверен, элемент корневого элемента считается нормальным, но неправильный ребенок, как я могу это исправить? нужна помощь, спасибо!

ответ

0

Вот код, с помощью конкретного теста:

EDIT (скорректированные с $ прилавком, не идентификатор)

function makeTree($data, $pre='') { 
    $result = array(); 
    $counter = 1; 

    if (is_array($data)) foreach ($data as $item) { 
    $result[] = $pre.$counter.' '.$item['address']; 
    if (isset($item['children']) && is_array($item['children'])) { 
     $result = array_merge($result, makeTree($item['children'], $pre.$counter.'-')); 
    } 
    $counter++; 
    } 

    return $result; 
} 

$data = array(
    array(
    'id' => 1, 
    'address' => 'addy 1', 
    'children' => array(
     array(
     'id' => 1, 
     'address' => 'addy 1.1', 
     'children' => array(
      array(
      'id' => 1, 
      'address' => 'addy 1.1.1', 
     ), 
     ), 
    ), 
    ), 
), 
    array(
    'id' => 2, 
    'address' => 'addy 2', 
    'children' => array(
     array(
     'id' => 1, 
     'address' => 'addy 2.1' 
    ), 
    ), 
) 
); 

$out_array = makeTree($data); 
print_r($out_array); 

Это только основные рекурсивная функция, которая выполняет очень похожи задача. Это не полное решение. Поместите свою конкретную логику там, чтобы создать конечный результат, который вам нужен, но основную идею «счетчика», которую вы запрашиваете для работы.

Надеюсь, это поможет.

+0

Похоже, что я, возможно, неправильно понял вопрос. позвольте мне немного переписать код. извините – loushou

+0

под редакцией. теперь использует счетчик вместо $ item ['id'] – loushou

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