我一直致力于递归函数,以便从几个级别的子类别到类别获取面包屑信息。我能够检索这个信息,但是一旦我用这个函数返回一个数组数组,我就不能用print_r看内容了。
在我咆哮之前,让我告诉你代码:
function breadcrumb_array ($id, $breadcrumb = array()) {
$cat_info = get_subcat_data($id);
if ($cat_info["parent_id"]>0) {
$breadcrumb[] = $cat_info;
breadcrumb_array($cat_info["parent_id"], $breadcrumb);
} else {
echo "About to return the value...";
//print_r(array_reverse($breadcrumb));
return array_reverse($breadcrumb);
}
}
$breadcrumb = breadcrumb_array(8);
print_r($breadcrumb);
如果我在函数中取消注释print_r(...)
,它将正确显示数组数组:
( [0] => Array
( [id] => 3
[nombre] => Muebles
[parent_id] => 1
[parent_urlname] =>
[parent_nombre] => Productos
)
[1] => Array
( [id] => 6
[nombre] => Sillas
[parent_id] => 3
[parent_urlname] =>
[parent_nombre] => Muebles
)
[2] => Array
(
[id] => 8
[nombre] => Sillas de cocina
[parent_id] => 6
[parent_urlname] =>
[parent_nombre] => Sillas
)
)
所以当我在最后执行print_r时,在调用函数之后,我希望打印相同的数组数组。但我一无所获。我想我已经测试了功能中可能出错的一切。打印返回值时,我真的看不出有什么问题。你能帮忙吗?
PS:如果有人需要,get_subcat_id()
功能如下:
//Retrieves mroe info about a certain categories and its parent
function get_subcat_data ($id) {
global $connection;
$query = "SELECT tblCategoria.id, tblCategoria.nombre, tblCategoria.parent_id, tblParents.urlname AS parent_urlname, tblParents.nombre AS parent_nombre
FROM tblCategoria JOIN tblCategoria AS tblParents ON tblCategoria.parent_id = tblParents.id
WHERE tblCategoria.id = {$id}
LIMIT 1";
$cats1 = mysql_query($query, $connection);
confirm_query($cats1);
$cats1 = mysql_fetch_assoc($cats1);
return $cats1;
}
答案 0 :(得分:5)
你没有在if
的第一个分支中返回任何内容。尝试:
if ($cat_info["parent_id"]>0) {
$breadcrumb[] = $cat_info;
return breadcrumb_array($cat_info["parent_id"], $breadcrumb);
}
当您在此函数中递归并到达递归的末尾时,它将返回反转的数组。但由于递归的调用者不使用return
,新数组将被丢弃,并且永远不会返回给原始调用者。
答案 1 :(得分:1)
我认为代码中的问题是,如果你在递归循环中执行print_r
,它会按预期显示当前的痕迹。但是如果你从外面做,那就不会因为你没有从你的递归链中返回任何东西(你正在调用函数,但你没有返回最后一次调用)。尝试返回递归函数:
function breadcrumb_array ($id, $breadcrumb = array()) {
$cat_info = get_subcat_data($id);
if ($cat_info["parent_id"]>0) {
$breadcrumb[] = $cat_info;
// HERE
return breadcrumb_array($cat_info["parent_id"], $breadcrumb);
} else {
return array_reverse($breadcrumb);
}
}
答案 2 :(得分:1)
使用print_r()时,将布尔值true作为第二个参数传递。这会将值打印为字符串。您将以这种方式获得更准确的调试数据,因为您将能够看到新行和其他值,否则这些值不会很明显。我会将它与error_log()函数结合使用,该函数将错误输出到php错误日志。这样您的调试就不会中断程序的正常流程。
以下是您可以使用此技术的示例:
error_log("About to return the result: " . print_r(array_reverse($breadcrumb), true));
如果您不确定PHP错误日志的位置,请检查您的php.ini。如果错误日志指令未在php.ini中正确配置,并且您将PHP作为Apache模块运行,则它将默认为Apache错误日志。
我怀疑当你这样做的时候,你会看到一些你以前没有看到过的东西。
希望这会有所帮助: - )
答案 3 :(得分:0)
将反向移动到函数外部。
$breadcrumb = array_reverse (breadcrumb_array(8));
我的猜测是它与你的函数递归有关,而你用array_reverse返回数组。当它结束时,数组被反转,PHP无法重建原始数组。