我创建了一个函数如下:
<?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)。有人可以帮帮我吗?
答案 0 :(得分: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在这种情况下会做什么)。
答案 1 :(得分:0)
如果两个第一个IF为真,那么该函数不会返回任何内容。