0

我一直在研究递归函数,以从子类别到类别的多个级别获取面包屑信息。我能够检索此信息,但是一旦我使用此函数返回一个数组数组,我就无法执行 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; 
}
4

4 回答 4

5

您不会在if. 尝试:

if ($cat_info["parent_id"]>0) {
    $breadcrumb[] = $cat_info;
    return breadcrumb_array($cat_info["parent_id"], $breadcrumb);
}

当您在此函数中递归并到达递归结束时,它将返回反转数组。但是由于递归的调用者不使用return,所以新数组被丢弃,并且永远不会返回给原始调用者。

于 2013-08-04T02:18:33.767 回答
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);
    }
}
于 2013-08-04T02:25:01.513 回答
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 错误日志。

我怀疑当你这样做时,你会看到以前没有看到的东西。

希望这可以帮助 :-)

于 2013-08-04T02:38:38.487 回答
0

将反向移动到函数之外。

$breadcrumb = array_reverse (breadcrumb_array(8));

我的猜测是它与您的函数递归有关,并且您正在返回使用 array_reverse 反转的数组。当它到达末尾时,数组被反转,PHP 在重建原始数组时遇到了麻烦。

于 2013-08-04T02:19:09.187 回答