2013-12-23 2 views
1

есть я дерево массив, выглядит следующим образом:Нумерация Дерево Массив

$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 

мне нужна помощь, чтобы построить этот числовой, спасибо!

ответ

2

Вы можете выполнить свою задачу без использования полей parent_id и без вспомогательного оборудования strLevel.

Просто перемещайте свой вложенный массив в функцию, вызывающую ту же функцию рекурсивно, если существуют дочерние узлы. Рекурсивно называемая функция должна получить дополнительный аргумент $prefix от своего вызывающего абонента, чтобы соответствующим образом отобразить более высокие уровни иерархии.

В вашем примере, $prefix будет 1- для второго слоя иерархии, 1-1- для 3-го и 4-го 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.

+1

Не совсем уверен в формулировке, но дайте человеку рыбу, накормите его на день. Научите человека рыбу, кормите его на всю жизнь (например, объясните свой ответ) – Daedalus

+0

@Deadalus Может быть, это лучше немного – zavg

+0

отлично, спасибо! Я хочу поместить данные в массив с одинаковой иерархией, когда я меняю вывод на вывод [], порядок разбит – user3111525

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