递归函数输出一个野生多维数组,希望它一层深



我正在尝试编写一个递归函数,该函数可以钻回深度未知的巢的根类别。

[TABLE]
   cat_id | cat_name | cat_parent | cat_slug  
   //each category with a cat_parent of 0 is a root category
[/TABLE]

示例SQL结果:

Array
(
[0] => Array
    (
        [cat_id] => 17
        [cat_name] => another-test-category
        [cat_parent] => 16
        [cat_slug] => Another test category
    )
)

功能:

function breadcrumb($cat_id){
 $cat_nest =     
            SELECT *
            FROM table
            WHERE cat_id = '$cat_id' 
           //returns 1 row;
  $cat_array[$cat_id] = $cat_nest[0];  
   if($cat_nest[0]['cat_parent'] != 0){
   $cat_array[] = breadcrumb($cat_nest[0]['cat_parent']);
   } 
   return $cat_array;
 }

输出:

Array
(
[17] => Array
(
    [cat_id] => 17
    [cat_name] => test.example.1
    [cat_parent] => 16
    [cat_slug] => Test Example 1
)
[18] => Array
(
    [16] => Array
        (
            [cat_id] => 16
            [cat_name] => test.example.2
            [cat_parent] => 15
            [cat_slug] => Test Example 2
        )
    [17] => Array
        (
            [15] => Array
                (
                    [cat_id] => 15
                    [cat_name] => test.example.3
                    [cat_parent] => 6
                    [cat_slug] => Test Example 3
                )
            [16] => Array
                (
                    [6] => Array
                        (
                            [cat_id] => 6
                            [cat_name] => test.example.4
                            [cat_parent] => 2
                            [cat_slug] => Test Example 4
                        )
                    [7] => Array
                        (
                            [2] => Array
                                (
                                    [cat_id] => 2
                                    [cat_name] => test.example.5
                                    [cat_parent] => 0
                                    [cat_slug] => Test Example 5
                                )
                        )
                )
        )
)
)
所需输出:

Array
(
[17] => Array
(
[cat_id] => 17
[cat_name] => test.example.1
[cat_parent] => 16
[cat_slug] => Test Example 1
)
[16] => Array
(
[cat_id] => 16
[cat_name] => test.example.2
[cat_parent] => 15
[cat_slug] => Test Example 2
)

[15] => Array
(
[cat_id] => 15
[cat_name] => test.example.3
[cat_parent] => 6
[cat_slug] => Test Example 3
)

[6] => Array
(
[cat_id] => 6
[cat_name] => test.example.4
[cat_parent] => 2
[cat_slug] => Test Example 4
)
[2] => Array
(
[cat_id] => 2
[cat_name] => test.example.5
[cat_parent] => 0
[cat_slug] => Test Example 5
)
)

我进行了一些测试,我认为解决方案可以这样实现:

function breadcrumb($cat_id){
    $cat_nest =     
    SELECT *
    FROM table
    WHERE cat_id = '$cat_id' 
    //returns 1 row;
    $cat_array[$cat_id] = $cat_nest[0];  
    if($cat_nest[0]['cat_parent'] != 0){
        $cat_array = array_merge( $cat_array, breadcrumb($cat_nest[0]['cat_parent']) );
    } 
    return $cat_array;
}

这将完全按照您需要的方式维护id,因为这只会合并数组,而不会使用$cat_array[]

创建新的索引。

考虑使用do-while-loop:

function breadcrumb($cat_id) {
 $cat_array = array();
 do {
   $cat_nest =     
            SELECT *
            FROM table
            WHERE cat_id = '$cat_id';
   $cat_array[$cat_id] = $cat_nest[0];
   $cat_id = $cat_nest[0]['catparent'];
   } while ($cat_id != 0)
 return $cat_array;
 }

这样,您还可以轻松地识别'第一个'面包屑,并为它添加额外的代码,如声明数组。

最新更新