打印返回的PHP数组不起作用


Printing returned PHP array not working

我一直在开发一个递归函数,以便在多个级别上从子类别到类别获取面包屑信息。我可以检索这些信息,但一旦我用这个函数返回一个数组,我就无法进行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在重建原始数组时遇到问题。