2017-02-21 78 views
2

如何用遞歸算父陣列..計數父陣列採用遞歸PHP

這裏是我的陣列

array 
(
    [0] => array 
    (
     [id]  => 1 
     [parent_id] => 0 
     [children] => array 
     (
      [0] => array 
      (
       [id]  => 2 
       [parent_id] => 1 
       [children] => array 
       (
        [0] => array 
        (
         [id]  => 3 
         [parent_id] => 2 
         [children] => array 
         (
          [0] => array 
          (
           [id]  => 4 
           [parent_id] => 3, 
          ), 

         ), 

        ), 

       ), 

      ) 

      [1] => array 
      (
       [id]  => 5 
       [parent_id] => 1, 
      ), 

     ), 

    ) 

    [1] => array 
    (
     [id]  => 1 
     [parent_id] => 0 
     [children] => array 
     (
      [id]  => 2 
      [parent_id] => 1 
      [children] => array 
      (
       [id]  => 3 
       [parent_id] => 2, 
      ), 

     ), 

    ) 

    [2] => array 
    (
     [id]  => 1 
     [parent_id] => 0, 
    ), 

) 

什麼,我想是這樣的結果..

array 
(
    [0] => array 
    (
     [id]   => 1 
     [parent_id] => 0 
     [parent_count] => 0 
     [children]  => array 
     (
      [0] => array 
      (
       [id]   => 2 
       [parent_id] => 1 
       [parent_count] => 1 
       [children]  => array 
       (
        [0] => array 
        (
         [id]   => 3 
         [parent_id] => 2 
         [parent_count] => 2 
         [children]  => array 
         (
          [0] => array 
          (
           [id]   => 4 
           [parent_id] => 3 
           [parent_count] => 3, 
          ), 
         ), 
        ), 
       ), 
      ) 
      [1] => array 
      (
       [id]   => 5 
       [parent_count] => 1 
       [parent_id] => 1, 
      ), 
     ), 
    ) 
    [1] => array 
    (
     [id]   => 1 
     [parent_id] => 0 
     [parent_count] => 0 
     [children]  => array 
     (
      [id]   => 2 
      [parent_id] => 1 
      [parent_count] => 1 
      [children]  => array 
      (
       [id]   => 3 
       [parent_id] => 2 
       [parent_count] => 2, 
      ), 
     ), 
    ) 
    [2] => array 
    (
     [id]   => 1 
     [parent_id] => 0 
     [parent_count] => 0, 
    ), 
) 

這裏原始陣列

$data[0] = array(
    'id'  => 1, 
    'parent_id' => 0, 
    'children' => array(
     '0' => array(
      'id'  => 2, 
      'parent_id' => 1, 
      'children' => array(
       '0' => array('id' => 3, 
        'parent_id'  => 2, 
        'children'  => array(
         '0' => array(
          'id'  => 4, 
          'parent_id' => 3, 
         ), 
        ), 
       ), 
      ), 
     ), 
     '1' => array(
      'id'  => 5, 
      'parent_id' => 1, 
     ), 
    ), 
); 
$data[1] = array(
    'id'  => 1, 
    'parent_id' => 0, 
    'children' => array(
     'id'  => 2, 
     'parent_id' => 1, 
     'children' => array(
      'id'  => 3, 
      'parent_id' => 2, 
     ), 
    ), 
); 
$data[2] = array(
    'id'  => 1, 
    'parent_id' => 0, 
); 

這裏我的遞歸函數

function recursive(array $data, $count = 0) 
{ 
    $count_parent = array(); 
    foreach ($data as $key => $dat) { 
     if ($dat['parent_id'] == 0) { 
      $data['count_parent'] = 0; 
      if (isset($dat['children'])) { 
       recursive($dat['children'], $count); 
      } 
     } else if ($dat['parent_id'] != 0 && array_key_exists('children', $dat)) { 
      $count++; 
      $data[$key]['count_parent'] = $count; 
      if (isset($dat['children'])) { 
       recursive($dat['children'], $count); 
      } 
     } else if ($dat['parent_id'] != 0 && !array_key_exists('children', $dat)) { 
      $count++; 
      $data[$key]['count_parent'] = $count; 
     } else { 
      $data['count_parent'] = 0; 
     } 
     $count_parent = $data; 
    } 
    return $count_parent; 
} 

它沒有工作。我不知道如何創建遞歸,我是新的使用這種方法。

我真的很感謝一些幫助。

謝謝:)

+2

請妥善格式化,如果可能縮小數組的大小。 –

+0

你正在遞歸地調用你的函數,但你沒有對它返回的值做任何事情。 – jeroen

+0

你需要像「當前深度」計數器那樣的東西嗎? – apokryfos

回答

1

試試這個:

<?php 

function recursive(&$data, $count = 0) { 
    $current_parent = ""; 

    foreach ($data as $key => &$dat) { 
     if (is_array($dat)) { 
      if ($current_parent != $dat['parent_id']) { 
       $count++; 
       $current_parent = $dat['parent_id']; 
      } 
      if ($dat['parent_id'] == 0) 
       $count = 0; 
      $dat['count_parent'] = $count; 
     } 
     if (is_array($dat) && array_key_exists('children', $dat)) { 
      recursive($dat['children'], $count); 
     } 
    } 
} 

recursive($data); 
echo "<pre>"; 
print_r($data); 
+0

非常感謝你,它的作品像魅力:) –