递归函数不返回任何内容

时间:2011-10-31 19:44:59

标签: php mysql recursion

我有一个包含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 "&nbsp;&nbsp;";
                        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部分,则它不会返回任何内容。基本上,如果它超过一个级别深。我没有收到任何错误,它只是返回一个空白的声明。我已经确认那里有信息也应该返回。感谢。

另外,我应该提到这是一个更大的班级。该课程的其余部分与这两种方法无关。

3 个答案:

答案 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

这使您可以直接从数据库查询所需的值。如果你有桌子的结构,我很乐意帮忙。