我一直在开发一个递归函数,以便在多个级别上从子类别到类别获取面包屑信息。我可以检索这些信息,但一旦我用这个函数返回一个数组,我就无法进行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;
}
在if
的第一个分支中没有返回任何内容。尝试:
if ($cat_info["parent_id"]>0) {
$breadcrumb[] = $cat_info;
return breadcrumb_array($cat_info["parent_id"], $breadcrumb);
}
当您在此函数中递归并到达递归的末尾时,它将返回反向数组。但是,由于递归的调用方不使用return
,因此新数组将被丢弃,并且永远不会返回到原始调用方。
I认为代码中的问题是,如果在递归循环中执行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);
}
}
使用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错误日志。
我怀疑,当你这样做的时候,你会看到一些你以前没有看到的东西。
希望这有帮助:-)
将反向移动到函数外部。
$breadcrumb = array_reverse (breadcrumb_array(8));
我的猜测是,这与你的函数是递归的有关,你正在返回用array_reverse反转的数组。当它到达末尾时,数组被反转,PHP在重建原始数组时遇到问题。