2015-08-18 3 views
2

У меня есть массив, который вызывается вызовом функции рекурсии на основе родительского id. Этот массив представляет собой многомерный массив уровня n. Я хочу разбить этот массив на одномерное, чтобы каждый ребенок приходил сразу после своего родителя. Я использую следующую функцию для первого преобразования в рекурсивное дерево.Как преобразовать многомерный рекурсивный массив в одномерный массив в PHP?

function formatTree($tree, $parent){ 
     $tree2 = array(); 
     foreach($tree as $i => $item){ 
      if($item['cat_parent_id'] == $parent){ 
       $tree2[$item['cat_id']] = $item; 
       $tree2[$item['cat_id']]['submenu'] = formatTree($tree, $item['cat_id']); 
      } 
     } 

     return $tree2; 
    } 

Это массив, который у меня есть.

Array 
(
    [58] => Array 
     (
      [cat_id] => 58 
      [cat_name] => Desserts 
      [cat_parent_id] => 0 
      [submenu] => Array 
       (
        [535] => Array 
         (
          [cat_id] => 535 
          [cat_name] => dessert child 
          [cat_parent_id] => 58 
          [submenu] => Array 
           (
           ) 

         ) 

       ) 

     ) 

    [56] => Array 
     (
      [cat_id] => 56 
      [cat_name] => Biryani & Rice 
      [cat_parent_id] => 0 
      [submenu] => Array 
       (
       ) 

     ) 
) 

Вот как я этого хочу.

Array 
(
    [0] => Array 
     (
      [cat_id] => 58 
      [cat_name] => Desserts 
      [cat_parent_id] => 0 
      [submenu] => Array 
       (

       ) 

     ) 
    [1] => Array 
        (
         [cat_id] => 535 
         [cat_name] => dessert child 
         [cat_parent_id] => 58 
         [submenu] => Array 
          (
          ) 

        )  

    [2] => Array 
     (
      [cat_id] => 56 
      [cat_name] => Biryani & Rice 
      [cat_parent_id] => 0 
      [submenu] => Array 
       (
       ) 

     ) 
) 
+0

Ответ на этот вопрос в целом не существует. В вашем конкретном случае вы можете использовать рекурсивную функцию, которая вызывает себя в подменю данного узла, если она не пуста. – GordonM

ответ

0

Таким образом, я предполагаю, что вы можете изменить свою первоначальную функцию, чтобы сделать массив как второй ... то вы должны обновить вашу функцию так:

function formatTree($tree, $parent){ 
     $tree2 = array(); 
     foreach($tree as $i => $item){ 
      if($item['cat_parent_id'] == $parent){ 
       $item['submenu'] = array(); 
       $tree2[] = $item; 
       formatTree($tree, $item['cat_id']); 
      } 
     } 
     return $tree2; 
    } 
+1

Это приведет к поломке вспомогательного массива в один массив, но мне нужно, чтобы он был сразу после их родителя. –

0

Это должно работать. Для вашего случая использования вам не нужен parent_id в вашей функции.

function formatTree($tree){ 
    $tree2 = array(); 
    foreach($tree as $i => $item){ 
    $submenu = $item['submenu']; 
    unset($item['submenu']); //clear submenu of parent item 
    $tree2[] = $item; 
    if(!empty($submenu)){ 
     $sub = formatTree($submenu); //submenu's return as array in array 
     $tree2[] = $sub[0]; // remove outer array 
    } 
    } 
    return $tree2; 
} 
0

Просто попробуйте это,

$array = Array 
(
    "58" => Array 
    (
     "cat_id" => 58, 
     "cat_name" => "Desserts", 
     "cat_parent_id" => 0, 
     "submenu" => Array 
     (
      "535" => Array 
      (
       "cat_id" => 535, 
       "cat_name" => "dessert child", 
       "cat_parent_id" => 58, 
       "submenu" => Array 
       () 

      ) 

     ) 

    ), 

    "56" => Array 
    (
     "cat_id" => 56, 
     "cat_name" => "Biryani & Rice", 
     "cat_parent_id" => 0, 
     "submenu" => Array 
     () 

    ) 
); 

function singledimensional($array) 
{ 
    $res = array(); 
    foreach ($array as $i => $item) { 
     $temparr = $item; 
     $item['submenu'] = array(); 
     $res[] = $item; 
     if (!empty($temparr['submenu'])){ 
       $child = singledimensional($temparr['submenu']); 
       $res[] = $child[0]; 
     } 
    } 
    return $res; 
} 

    echo '<pre>'; 
    print_r(singledimensional($array)); 
    echo '</pre>'; 

Выход:

Array 
(
    [0] => Array 
     (
      [cat_id] => 58 
      [cat_name] => Desserts 
      [cat_parent_id] => 0 
      [submenu] => Array 
       (
       ) 

     ) 

    [1] => Array 
     (
      [cat_id] => 535 
      [cat_name] => dessert child 
      [cat_parent_id] => 58 
      [submenu] => Array 
       (
       ) 

     ) 

    [2] => Array 
     (
      [cat_id] => 56 
      [cat_name] => Biryani & Rice 
      [cat_parent_id] => 0 
      [submenu] => Array 
       (
       ) 

     ) 

) 

Я надеюсь, что это поможет :)

0

(PHP 4> = 4.0.1, PHP 5)

array_merge_recursive - Объединение двух или более массивов рекурсивно

`Функция array_merge_recursive_distinct (массив & $ массив1, массив & $ массив2) { $ слиты = $ массив1;

foreach ($array2 as $key => &$value) 
{ 
    if (is_array ($value) && isset ($merged [$key]) && is_array ( $merged [$key])) 
    { 
    $merged [$key] = array_merge_recursive_distinct ($merged [$key], $value); 
} 
else 
{ 
    $merged [$key] = $value; 
} 

}

возвращение $ слиты; } ?> `

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