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

时间:2013-08-04 02:07:52

标签: php arrays

我一直致力于递归函数,以便从几个级别的子类别到类别获取面包屑信息。我能够检索这个信息,但是一旦我用这个函数返回一个数组数组,我就不能用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 个答案:

答案 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无法重建原始数组。