编号树阵列

时间:2013-12-23 08:37:24

标签: php arrays recursion

有一个我的树阵列,看起来像这样:

$testArray = array(
  array(
    'id' => 12,
    'address' => 'root addr',      
    'parent_id' => 0,
    'children' => array(
      array(
        'id' => 11,
        'address' => 'child addr',                  
        'parent_id' => 12,
        'children' => array(
          array(
            'id' => 16,
            'address' => 'child addr 2',
            'parent_id' => 11,
            'children' => array(
              array(
                'id' => 19,
                'address' => 'child addr 3',
                'parent_id' => 16,
              ),
            ),
          ),
          array(
            'id' => 18,
            'address' => 'child addr 4',
            'parent_id' => 11,
          ),
          array(
            'id' => 20,
            'address' => 'child addr 5',
            'parent_id' => 11,
          ),
        ),
      ),
    ),
  ),
  array(
    'id' => 17,
    'address' => 'root addr 2',        
    'parent_id' => 0,
  ),
);

我有一个函数来构建一个级别的数组:

$result = array('aaData' => array());

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

            foreach ($data as $item) {  

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

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

                    $addr =  strLevel(' - ', $level) . $item['address'];  


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

                global $result;

                $result['aaData'][] = Array(
                 $addr,

             );  

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


            }

 return $result;        
}

另一个尝试绘制编号的功能,但它不是我想要的:

function strLevel($str, $level) {
    $level++;
    $result = '';

    for ($i = 1; $i < $level; $i++) {

      if ($i == 1) {
        $result .= $i . ' - ' . $i;
      } else {

      $result .= $str.$i;
    }
  }

  $result .= '.';
  return $result;
}

我的输出是这样的:

1. root addr
1 - 1.child addr
1 - 1 - 2.child addr 2
1 - 1 - 2 - 3.child addr 3
1 - 1 - 2.child addr 4
1 - 1 - 2.child addr 5
2. root addr 2

但我需要另外一个数字结构,如:

1. root adrr
1-1. child adrr
1-1-1. child child addr
1-2. child addr
1-2-1. child child addr
1-3. child addr
1-3-1. child child addr
2. second root adr
2-1. child addr
2-1-1. child child addr

我需要帮助,建立这个数字,谢谢!

1 个答案:

答案 0 :(得分:2)

您可以在不使用parent_id字段且没有辅助strLevel功能的情况下完成任务。

如果子节点存在,只需在函数中遍历嵌套数组,递归调用相同的函数。递归调用的函数应该从其调用者接收额外的参数$prefix,以适当地呈现更高级别的层次结构。

在您的示例中,第二层层次结构$prefix1-,第三层为1-1-,第四层为1-1-1-

function printTree($arr, $prefix = "")
{
    $output = "";
    $index = 1;
    foreach ($arr as $item) {
        $output .= $prefix . $index . "." . $item["address"] . "<br/>";
        if (array_key_exists("children", $item))
            $output .= printTree($item["children"], $prefix . $index . "-");
        $index++;
    }
    return $output;
}

echo printTree($testArray);

测试数组$testArray的输出是

1. root addr
1-1. child addr
1-1-1. child addr 2
1-1-1-1. child addr 3
1-1-2. child addr 4
1-1-3. child addr 5
2. root addr 2

P.S。:该解决方案假定您生成HTML作为输出。如果您要将输出发送到控制台,请不要忘记将<br/>更改为\n