Php递归问题没有发回值

时间:2018-03-31 13:10:12

标签: php mysql drupal

这是我将用于解决我之前发布的复杂问题的代码。 这背后的逻辑是 - 在递归的每次迭代中,函数应该减少$ wa为$ amount,已经进行了,并计算新的$ wa,以找到新的$ amount,直到系统找不到表中的$ amount会更大,然后得到$ wa,并继续它作为最后一次迭代。 当试图开发它时,代码没有返回任何内容,没有错误,没有回声。我做错了什么?

    $wa = 0.001;
    $address = $address;
    function recursion($wa)
    {
      $resulte = db_select ('Credit_user','c')
      ->fields ('c')
      ->range(0,1)
      ->orderby('cr_ts', 'ASC')
    ->condition('c.affected','0','=')
    ->condition('c.amount','0','!=')
     ->execute();
    foreach($resulte as $item) {
       $code = $item->redeem_code;
      global $code;
       $amounte = $item->amount;
      global $amounte; 
      $wai = $wa - $amounte;
    global $wai;
    if ($wai < 0){  
      echo "production code that should operate with different 
variations of $amounte and $redeem on last iteration";
      return;
    }
    elseif ($wai >= 0){  echo "production code 
that should operate with different variations 
of $amounte and $redeem on each iteration";

      return;

    } else {
      function recursion($wa){
    }
    }

    }}
    echo $amounte;
    echo "<br>";

1 个答案:

答案 0 :(得分:0)

至少这部分是错误的

} else {
   function recursion($wa){
}

应该是

} else {
   return recursion($wa);
}

但是这段代码的其余部分非常混乱,所以......

例如,这个逻辑

if ($wai < 0){ 
   //... 
}elseif ($wai >= 0){
    //...
}else{
   //not reachable
   return recursion($wa);
}

非常有缺陷。因为无法访问else块。换句话说,没有什么能满足else条件,因为大多数值都会通过elseif,其范围内有10,PHP中的许多内容都会计算出1{true}或{ {1}}因为PHP的输入错误。

更新

您可以自己测试这个条件

0{false}

输出

$tests = [
    false,
    -10,
    1,
    0,
    [],        ''
];

foreach($tests as $wai){
    if ($wai < 0){ 
       echo "1";
    }elseif ($wai >= 0){
        echo "2";
    }else{
       echo "3";
    }

    echo "\n"; 
}

正如你所看到的那样,没有#3来自2 1 2 2 2 2 区块,正如我所说,这是不可能达到的。因此,这个函数不会递归,因此不能从所述不存在的递归中返回任何内容。

测试online

此外:

else

必须首先宣布全球。

$wai = $wa - $amounte;
global $wai;

我们可以通过设置功能范围来测试它。

global $wai;
$wai = $wa - $amounte;

现在可以预期这会打印function foo(){ $wai = 50; global $wai; echo $wai; } global $wai; $wai = 100; foo(); ,但会打印50。它以这种方式执行:

  1. PHP解析并解释代码
  2. 我们在函数
  3. 之外声明全局100
  4. 我们将$wai设置为= 100(分配)
  5. 我们称之为函数$wai
  6. 我们设置了局部变量foo = 50;
  7. 然后我们将$wai声明为全局,并从全局范围(函数范围之外)继承全局$wai的值,该值为100
  8. 然后我们回应那个价值。
  9. 这是您的代码的非常接近的近似值,它在功能上等同于Check it yourself

    现在,如果您更改订单

    $wai

    它输出function foo(){ global $wai; $wai = 50; echo $wai; } global $wai; $wai = 100; foo(); 测试this

    让我们看看,50函数需要更改才能返回。假设递归有效,但事实并非如此。人们必须假设,在某些时候,如果我指出的条件,它会被认为是其中两个部分之一。如果它不这样做,我们将无限递归,直到PHP内存不足和崩溃或最大执行时间被命中。所以我们同意它必须经过那些。现在它怎么能从

    返回任何东西
    echo

    如果其他两个返回仅为return recursion($wa); 或返回return;。如果函数的下一次迭代将null返回到我们以递归方式调用所述函数的返回,那么它的本质是非常自然的,那么该调用也必须返回null。

    null

    所以

    echo "production code that should operate with different variations of $amounte and $redeem on last iteration";
    return; 
    

    换句话说,它几乎都被打破了。请不要采取错误的方式,我只是指出我看错了。每个人都必须从学习代码开始,我有近8年的专业网页设计和PHP编程经验。但是,我仍然记得学习的内容,我仍然犯了很多错误。

    我已经指出了我可以修复的东西,但对于像if逻辑这样的东西,我无法弄清楚那个逻辑应该是什么。我只能指出它崩溃的地方。