我有一个包含autopart数字的数据库,需要更新旧的部件号。每行都有一个零件号(字段名称“master”)一个价格和一个带有被取代(较新)零件号的字段(字段名称“pnc”)。该脚本需要检查“pnc”字段是否为空。如果不是,它应该去抓住这个数字的价格。很容易。
但是,某些部件号具有未知的数字级别,直到达到最新的部件号和价格。所以,我认为递归函数是最好的解决方案。但是,它无法正常工作。这是代码:
public function updatePricing()
{
//method to update pricing by referencing supersession prices
$sql = "SELECT * FROM prices";
$result = mysql_query($sql);
$num_rows = mysql_num_rows($result);
for($i=0;$i<2000;$i++) //using 2000 for testing, use $num_rows after
{
$row = mysql_fetch_array($result);
$id = $row['id'];
$super_num = $row['pnc'];
//if there is a supersession in this row find original
if(!empty($super_num))
{
$final_super_price = $this->findSuperPrice($super_num);
echo "partnum: " . $row['master'];
echo " ";
echo "price: " . $final_super_price . "<br /><br />";
}
}
}
public function findSuperPrice($part_num)
{
$sql = "SELECT * FROM prices WHERE master='" . $part_num . "'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if (empty($row['pnc'])) //if there aren't any supersession numbers
{
$final_price = $row['list'];
return $final_price;
}
else //recursively call itself until we find the last number
{
$this->findSuperPrice($row['pnc']);
}
}
正在发生的事情是updatePricing()函数一直运行,直到找到“pnc”字段中有条目的行。如果是,则调用findSuperPrice()函数。 findSuperPrice()函数应该递归运行,直到“pnc”字段为空。当发生这种情况时,会返回一个数字。
但是,如果它实际到达findSuperPrice()中if语句的else部分,则它不会返回任何内容。基本上,如果它超过一个级别深。我没有收到任何错误,它只是返回一个空白的声明。我已经确认那里有信息也应该返回。感谢。
另外,我应该提到这是一个更大的班级。该课程的其余部分与这两种方法无关。
答案 0 :(得分:4)
您需要返回一个值。更改此代码:
else //recursively call itself until we find the last number
{
$this->findSuperPrice($row['pnc']);
}
对此:
else //recursively call itself until we find the last number
{
return $this->findSuperPrice($row['pnc']);
}
答案 1 :(得分:2)
您目前没有获得返回值,因为如果findSuperPrice
不为空,则会忽略$row['pnc']
的结果。正确返回递归调用的值:
return $this->findSuperPrice($row['pnc']);
答案 2 :(得分:1)
您在else
内的findSuperPrice
案例中缺少一个return语句。
但是......看起来你正在抽取大量数据来查看/操纵一个字段。你也可以在mysql中编写函数,类似于我在这里发布的函数:MySQL: Get Root Node of Parent-Child Structure
这使您可以直接从数据库查询所需的值。如果你有桌子的结构,我很乐意帮忙。