0

我创建了如下函数:

<?php
$cat_id=2;
$ids=array();
$ids[]=2;
var_dump(fetchParents($cat_id,$ids));
function fetchParents($cat_id,$ids){
    $db=mysql_connect("localhost","root","") or die("could not connect to database");
    mysql_select_db("symfony",$db) or die("could not connect to symfony database");
    $query="SELECT parent_id FROM categories WHERE id='$cat_id'";
    $result=mysql_query($query,$db);
    if (mysql_num_rows($result)==1) {
        $cat=mysql_fetch_array($result);
        if (isset($cat['parent_id'])) {
             $ids[]=$cat['parent_id'];
             fetchParents($cat['parent_id'],$ids);
        }
        else {
            var_dump($ids);
            return $ids;
        }

    }
    else {
        return $ids;
    }
}
?>

该函数应该返回一个数组,但我得到 null 并且我确定 $ids 是一个数组。我还在返回数组的函数中使用 var_dump($ids) 进行了检查。有人可以帮助我吗?

4

2 回答 2

3

return有一个控制流在退出函数之前不执行语句。你需要改变

fetchParents($cat['parent_id'],$ids);

return fetchParents($cat['parent_id'],$ids);

否则,在该行之后,函数退出时没有return.

添加:

要转换为循环:

function fetchParents($childId)
{
    $ids = array();

    $db=mysql_connect("localhost","root","") or die("could not connect to database");
    mysql_select_db("symfony",$db) or die("could not connect to symfony database");

    while (true)
    {
        $res = mysql_query("SELECT parent_id FROM categories WHERE id=$childId");
        $row = mysql_fetch_assoc($res);
        if (is_null($row['parent_id']) )
            return $ids;
        $ids[] = $row['parent_id'];
        $childId = $row['parent_id'];
    }
}

顺便说一句 - 我看到在原始示例中,您还将起始元素的 ID 添加到数组中。如果是这样,那么它可以变得更加优雅:

function fetchParents($childId)
{
    $ids = array();

    $db=mysql_connect("localhost","root","") or die("could not connect to database");
    mysql_select_db("symfony",$db) or die("could not connect to symfony database");

    while (!is_null($childId))
    {
        $ids[] = $childId;
        $res = mysql_query("SELECT parent_id FROM categories WHERE id=$childId");
        $row = mysql_fetch_assoc($res);
        $childId = $row['parent_id'];
    }
    return $ids;
}

SELECT请注意,当查询不返回任何行时,这两者都不会处理这种情况。我认为这不会发生,因为您是按 ID 选择的。但是,如果这是可能的,那么您还需要检查$row === false,否则您会收到很多警告/错误消息(不确定 PHP 在这种情况下会做什么)。

于 2013-03-13T07:39:57.750 回答
0

如果前两个 IF 为真,则该函数不返回任何内容。

于 2013-03-13T07:40:10.723 回答