递归函数输出一个狂野的多维数组,希望它深一层
Posted
技术标签:
【中文标题】递归函数输出一个狂野的多维数组,希望它深一层【英文标题】:Recursive function outputting a wild multidimentional array, would like it one level deep 【发布时间】:2014-05-08 21:11:43 【问题描述】:我正在尝试编写一个递归函数,该函数可以追溯到深度未知的嵌套的根类别。
[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
)
)
【问题讨论】:
这看起来与您的previous question 非常相似。$cat_nest
这里是什么?它在哪里初始化?
@AmalMurali 上一个问题是事后将数组展平。我想知道是否可以通过修复输出它的递归函数来避免该步骤。 $cat_nest 是一次返回 1 行的 SQL 查询的结果。示例输出显示在“示例 sql 结果”中
【参考方案1】:
我进行了一些测试,我认为可以这样实现解决方案:
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[]
创建新索引
【讨论】:
您的代码易受 SQL 注入攻击。您应该使用准备好的语句。【参考方案2】:考虑使用 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;
这样您还可以轻松识别“第一个”面包屑,并为其添加额外代码,例如声明数组。
【讨论】:
感谢您的回答,您的最新代码运行良好,但@Ozmah 启发了这个问题,因此回答了我的两个问题。您的解决方案实际上可能更有效,因为它不使用 array_merge。 我选择了那个解决方案来维护它的递归函数,但我承认这个解决方案在性能方面似乎要好得多:)以上是关于递归函数输出一个狂野的多维数组,希望它深一层的主要内容,如果未能解决你的问题,请参考以下文章