2017-12-22 14 views
0

일치하는 키에 따라이 평면 배열을 다차원 배열로 변환하려면 어떻게해야합니까?부모 키로 다차원 배열로 PHP 플랫 배열?

$items = [ 
    0 => [ 
     'id' => 100, 
     'parent' => 0, 
     'url' => 'Home' 
    ], 

    1 => [ 
     'id' => 101, 
     'parent' => 0, 
     'url' => 'About' 
    ], 

    2 => [ 
     'id' => 102, 
     'parent' => 101, 
     'url' => 'Group' 
    ], 

    3 => [ 
     'id' => 103, 
     'parent' => 102, 
     'url' => 'Mission' 
    ], 
    4 => [ 
     'id' => 104, 
     'parent' => 102, 
     'url' => 'Vision' 
    ], 
]; 

내 시도 :

$new_items = array(); 
foreach ($items as $key => $item) { 

    // Store what you need. 
    $temp_item = array(
     'id' => $item['id'], 
     'url' => $item['url'], 
     'parent_id' => $item['parent'], 
     'children' => array() 
    ); 

    // Item does not have a parent so item_parent equals 0 (false). 
    if (!$item['parent']) { 
     // Push the item to the array. 
     array_push($new_items, $temp_item); 
    } 

    // Item that has a parent. 
    if ($item['parent']) { 

     // Search key by column 'id'. 
     $key = array_search($item['parent'], array_column($new_items, 'id')); 

     // Push sub item to the children array. 
     array_push($new_items[$key]['children'], $temp_item); 
    } 
} 

print_r($new_items); 

결과 :

Array 
(
    [0] => Array 
     (
      [id] => 100 
      [url] => Home 
      [parent_id] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 103 
          [url] => Mission 
          [parent_id] => 102 
          [children] => Array 
           (
           ) 

         ) 

        [1] => Array 
         (
          [id] => 104 
          [url] => Vision 
          [parent_id] => 102 
          [children] => Array 
           (
           ) 

         ) 

       ) 

     ) 

    [1] => Array 
     (
      [id] => 101 
      [url] => About 
      [parent_id] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 102 
          [url] => Group 
          [parent_id] => 101 
          [children] => Array 
           (
           ) 

         ) 

       ) 

     ) 

) 

이것은 내가 무엇을 후 :

Array 
(
    [0] => Array 
     (
      [id] => 100 
      [url] => Home 
      [parent_id] => 0 
      [children] => Array 
       (
       ) 

     ) 

    [1] => Array 
     (
      [id] => 101 
      [url] => About 
      [parent_id] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 102 
          [url] => Group 
          [parent_id] => 101 
          [children] => Array 
           (
            [0] => Array 
             (
              [id] => 103 
              [url] => Mission 
              [parent_id] => 102 
              [children] => Array 
               (
               ) 

             ) 

            [1] => Array 
             (
              [id] => 104 
              [url] => Vision 
              [parent_id] => 102 
              [children] => Array 
               (
               ) 

             ) 
           ) 

         ) 

       ) 

     ) 

) 

어떤 아이디어 및 제안?

답변

1

link

에서 나는 요구 사항에 따라 함수의 매개 변수를 변경했습니다.
다음은 귀하의 코드입니다.

function buildTree(array $elements, $options = [ 
    'parent_id_column_name' => 'parent', 
    'children_key_name' => 'children', 
    'id_column_name' => 'id'], $parentId = 0) 
    { 
    $branch = array(); 
    foreach ($elements as $element) { 
     if ($element[$options['parent_id_column_name']] == $parentId) { 
      $children = buildTree($elements, $options, $element[$options['id_column_name']]); 
      if ($children) { 
       $element[$options['children_key_name']] = $children; 
      }else{ 
       $element[$options['children_key_name']] = []; // added this line for empty children array 
      } 
      $branch[] = $element; 
     } 
    } 
    return $branch; 
} 

여기에 demo이 있습니다.

+0

감사하지만 간단 할 수 있습니까? – laukok

+0

최적화되어 있지만 n 레벨로 강력합니다. – rahulsm