如何在PHP递归函数中使用return


How to use return inside a recursive function in PHP

这是我的问题:我试图为我的应用程序创建一个随机条形码。我想检查该代码是否已经在列中,然后生成一个新数字。再检查一遍。如果是唯一的,则返回给调用者,否则重新生成。

为了达到这个目的,我使用了一个递归函数。我在数据库中添加了数字1 2 3 4所以每次运行时。它必须显示5、6、7、8、9或10。

下面是我的函数:

function generate_barcode(){
    $barcode = rand(1,10);
    $bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'"));
    if($bquery==1){
        generate_barcode();
    }else{
        return $barcode;    
    }
 }

我就像这样测试它:

 $a = generate_barcode();
 if(isset($a))
 {
   echo $a;
 }
 else
 {
  echo 'Not Set';
 }  

所以问题是,它有时显示我"Not Set",但我希望它总是产生一个唯一的数字。我没有插入数据,所以所有的数字都被保留是没有问题的。

有人指导我,让我知道什么是错误的代码。我可以使用其他方法来做到这一点,但我需要知道所提供的代码有什么问题。

您还需要返回从递归调用生成的数字,如:

function generate_barcode() {
  $barcode = rand(1, 10);
  $bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'"));
  if ($bquery == 1) {
    return generate_barcode(); // changed!
  }
  else {
    return $barcode;
  }
}

(在所有数字都被"占用"的情况下,你应该包括某种退出。当前版本将递归地调用自身,直到达到PHP递归限制,然后抛出错误。

返回语句将一个值传递给当前函数调用帧的直接调用者。在递归的情况下,这个直接调用者可以是同一函数的另一个调用。

你可以这样做:

改变:

generate_barcode();

:

return generate_barcode();

这样做:

$hash = md5( microtime().rand(0, 1000) );

添加时间组件意味着几乎是唯一的。除非你有32^32个

如果必须是数字,只需使用pkey并在上面加上10000就可以了。或者这样。

经过仔细分析-没有问题,但是:

$a = generate_barcode();
if(isset($a))  <<< this bit

看到你返回唯一值然后你说它是isset我的唯一值,$a总是被设置,因为如果它不是你递归函数直到它是,然后你返回它。

您要做的是:

while(true) {
    $barcode = rand(1,10);
    $bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'"));
    if($bquery===0){
        break;
    }
}
echo $barcode;

然而,这显然只适用于10个条形码,并导致无限循环,这意味着它不是创建大量条形码的正确方法。

我建议使用auto_increment来生成条形码。

顺便说一句,不推荐使用mysql扩展。使用mysqliPDO的新代码