【问题标题】:assigned variable is not working in do while loop in using PHP分配的变量在使用 PHP 的 do while 循环中不起作用
【发布时间】:2019-04-21 05:55:42
【问题描述】:

我正在我的项目中使用Do While loop,它的工作第一次很好

while statement 之前,我为数组赋值我可以在代码底部成功打印数组,但是当我在顶部检查时它的变为0循环

代码:

$looparray = array();
$loopend = 0;
$arraymer = array();
$poolafirtsid = $previous_array_values; //previous array values

do {
   if (sizeof($looparray) == 0) {
       $firstsponarray = $poolafirtsid;
   } else {
       $firstsponarray = $looparray;
   }

   $firstsponarray = getUserArray($poolafirtsid);
   //get user arraylist of first

   foreach ($firstsponarray as $avalue) {
       $rooparray = membercount($avalue);
       $bsponarray = getUserArray($avalue);
       //get second users arraylist 9
       if (sizeof($bsponarray > 0)) {
           $barraymer = array_merge($barraymer, $bsponarray);
       }

       $aarraylist[$avalue] = $rooparray;
   }

   $asmallestsponid = getSmallestID($aarraylist);
   //get smallest id in the array

   if (membercount($asmallestsponid) < 3) {
       $loopend = 1;
   } else {
       global $pooldata;
       if (count($barraymer) > 0) {
           $pooldata = $barraymer;
       }
       print_r($pooldata);

   }
} while ($loopend == 1);

当我在 else 中打印时,它可以工作,但我无法打印 do 循环的开始,它显示的数组大小为 0

【问题讨论】:

  • 如果不查看membercount()getUserArray()getSmallestID() 函数的代码或返回值,就无法进行调试。考虑使用它们的返回值而不是调用来更新您的问题,因此向 MVCE 提供硬编码值并检查它们是否仍然存在错误
  • 但是我的代码运行良好,我得到了值。我担心的是当我检查代码时,$looparray 数组大小变成了 0。但是在其他条件下,我在代码底部得到了正确的结果。
  • 如前所述,如果您正在寻求帮助,我们需要这些函数返回的值,即 MCVE
  • 请查看我在使用 print_r 时在代码底部得到的结果,我无法访问代码顶部以重用
  • 还可以考虑在未来关注PSR-x,请注意variable naming 可以提升您对代码的理解很多。永远不要低估代码中语义的力量

标签: php loops while-loop do-while


【解决方案1】:

我们不知道membercount($asmallestsponid) 返回什么,但它似乎(很可能)在第一次通过时就进入了

} else {
                $looparray = $arraymer;
                //print_r($looparray);
}

$loopend 的值没有改变,即保持在0 并且在第一遍比较01 并决定以0 != 1 退出do {} while 循环

【讨论】:

  • 但我的条件是它应该只在 $loopend 等于 1 时退出,否则它应该转到顶部并执行 $looparray。
  • membercount 很好,它返回值并满足条件,否则我在打印时将一个数组分配给 $looparry,它显示了我想在顶部使用这个数组的结果,所以它会如果我使用“for”循环进行下一步,我可以获得 $lopparray 但在 do_while 数组的大小为零
  • 我不明白。如果它进入if(membercount($asmallestsponid)&lt;3),那么如果它到达那里一次,就会有一个 break 语句导致完全退出 do/while 循环。如果它到达 else ,$loopend 没有变化,所以你的 do/while 只能工作一次
  • 是的,如果它进入 if(membercount($asmallestsponid)
  • 我告诉你,如果它进入 else,它不会将 $loopend 的值更改为 1,这也会结束循环
【解决方案2】:

您的代码存在几个问题。首先,这没有任何作用:

if (sizeof($looparray)==0) {
    $firstsponarray= $poolafirtsid;
} else {
    $firstsponarray= $looparray;
}

因为那段代码之后的下一行是:

$firstsponarray= getUserArray($poolafirtsid);

它会覆盖之前对$firstsponarray 的任何分配。

其次,$looparray 的值在do 循环中根本没有变化,所以它总是一个空数组。我找到了这一行:

$rooparray=membercount($avalue);

我认为这是一个错字,正确的行是$looparray=membercount($avalue);。与$aarraylist[$avalue]=$rooparray; 行相同。但是,由于我在顶部描述的原因,$firstponarray 永远不会等于 $looparray,因此更改它也无济于事。

首先尝试调试您的代码,如果问题仍然存在,请发布更新的代码。

【讨论】:

    【解决方案3】:

    我将忽略所有名称问题,但会解决您的 while 循环问题:

    $loopend =0;
    do {
        ...
        if(membercount($asmallestsponid)<3) {
             $loopend = 1;
        }else{
          ...
        }
    while ($loopend == 1);
    

    有两种选择:

    1. if 条件为 true:如果是,$loopend 将得到 1,因此循环 继续(这似乎不适合称他为“循环结束” " 但是有什么...)

    2. if 条件为 false:那么 $loopend 保持不变(初始化为 0),因此循环将停止

    恕我直言 - 这将简化您的循环:

    do {
        ...
    while (membercount($asmallestsponid)<3);
    

    【讨论】:

    • 是的,这就是我要找的。非常感谢。什么是恕我直言?
    • “以我的拙见”。很高兴为您提供帮助!
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多