数组中的层次结构,php中的递归

时间:2013-12-22 07:49:29

标签: php arrays recursion

我在数组中有层次结构,如下所示:

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;        
        }

但我的结果不正确,root的元素计数正常,但是孩子错了,我该如何解决这个问题?需要帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

以下是一些代码,包含您的特定测试用例:

编辑(使用$ counter更正,而不是ID)

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

这只是一个执行非常类似任务的基本递归函数。这不是完整的解决方案。把你的特定逻辑放在那里,以创建你需要的最终输出,但你要求的基本“反”的想法是有用的。

希望这有帮助。