Php While循环测试替代方案

Php While循环测试替代方案,php,coding-style,Php,Coding Style,我有一些非常难看的代码,我需要帮助清理它。我相信一定有更好的办法。 我有一个$\u POST变量,其中包含start\u doy0、start\u doy1、start\u doy2等条目 后面的条目无法填写,我需要找出它们填写的内容。 我不能从$completed\u index=-1开始,因为没有start\u doy-1 #Assume at least one line full, index 0. $completed_index = 0; while (!empty($_POST[

我有一些非常难看的代码,我需要帮助清理它。我相信一定有更好的办法。 我有一个$\u POST变量,其中包含start\u doy0、start\u doy1、start\u doy2等条目

后面的条目无法填写,我需要找出它们填写的内容。 我不能从$completed\u index=-1开始,因为没有start\u doy-1

#Assume at least one line full, index 0.
$completed_index = 0;
 while (!empty($_POST['start_doy'.$completed_index]))
 {
 $completed_index++;
 }

# $_POST['start_doy'.$completed_index] was empty, decrement $completed_index.
$completed_index--;
Thnks,
Matt

您可以删除一些括号并将其更改为isset,但除此之外,代码在我看来非常干净:

$completed_index = 0; # assume at least one line full, index 0.
while(isset($_POST['start_doy'.$completed_index])) $completed_index++;
$completed_index--; # $_POST['start_doy'.$completed_index] was empty, decrement $completed_index.

您可以像这样使用计数函数:

$completed_index = count($_POST);
然后移除其他元素。例如,如果您有两个其他元素,请执行以下操作:

$completed_index -=2;

有两种解决方案,这取决于您可以更改调用代码的程度,以及是否保证按顺序填写开始日期字段,即用户不能填写开始日期9,但不能填写开始日期2

选项1:更改HTML,以便使用数组语法提交表单字段,如下所示:

One: <input type="text" name="start_doy[]"/><br/>
Two: <input type="text" name="start_doy[]"/><br/>
<?php

$completed_indexes = array();

if(isset($_POST['start_doy']))
{
    foreach($_POST['start_doy'] as $key => $start_doy)
    {
        if(false == empty($start_doy))
            $completed_indexes[] = $key;
    }
}

echo count($completed_indexes);

?>
在PHP方面,这将转换为一个数组,因此您的处理可以是这样的:

One: <input type="text" name="start_doy[]"/><br/>
Two: <input type="text" name="start_doy[]"/><br/>
<?php

$completed_indexes = array();

if(isset($_POST['start_doy']))
{
    foreach($_POST['start_doy'] as $key => $start_doy)
    {
        if(false == empty($start_doy))
            $completed_indexes[] = $key;
    }
}

echo count($completed_indexes);

?>
选项2:或者,如果您无法更改HTML,或者更喜欢此解决方案,则可以迭代数组并检查键是否与您想要的匹配:

<?php

$completed_indexes = array();

foreach($_POST as $key => $value)
{
    if(substr($key,0,9) == "start_doy" && false == empty($value))
        $completed_indexes[] = $key;
}

echo count($completed_indexes);

?>
只用 阿尔戈

然后您可以简单地使用所有post值

foreach ($clean_post as $doy => $value) {
...
}
只有非空值将保留在$clean_post中,这在C中通过PHP函数可以更快地完成

-

在当前算法中:

您可能还需要检查0 阿尔戈


结果:$completed_index是已完成索引的数量最后一个索引是$completed_index-1或-1如果没有

如果至少存在索引0,则可以从1开始,而不是从0开始。您应该包含字段,以便您可以使用数组。如果用户完成start_doy0、start_doy2和start_doy3但不启动_doy1,您的while循环将在启动doy2和启动doy3之前停止-因此您可能会错过一些东西。我不知道这是否相关…:这是$completed_索引-这让我很恼火!好将其重命名为$ci或类似的名称;选项1总是更可取的,但为什么要测试每个$u POST['start\u doy']变量的值?那是不必要的。你只需检查一下它的大小,就可以知道有多少个大小是$u POST['start\u doy']。因为,如果它被张贴,它应该在那里@DainisAbols-在foreach中进行测试的原因是检查值是否为空。OP使用空-因此我假设可能有start\u doy0->start\u doy10,但可能只有用户输入的start\u doy0->start\u doy4。好吧。。。如果只想显示设置变量的计数,也可以这样做:echo array\u sumarray\u count\u values$\u POST['start\u doy']-$res=array\u count\u values$\u POST['start\u doy']?$res[]:0;是的,除了完全不可读的代码-1行!=1337OP可能也想使用这些值,计数只是一个例子;我改变了HTML-所有方面都整洁多了!