而循环测试替代

时间:2013-02-05 08:07:33

标签: php coding-style

我有一些非常难看的代码,我需要帮助来清理它。我相信一定有更好的方法。 我有一个带有条目start_doy0,start_doy1,start_doy2等的$ _POST变量。

后来的条目我没有填补,我需要找到他们填补的东西。 我不能从$ completed_index = -1开始,因为没有start_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, 马特

4 个答案:

答案 0 :(得分:0)

你可以删除一些括号并将其更改为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.

答案 1 :(得分:0)

您可以使用“count”函数,如下所示:

$completed_index = count($_POST);

然后删除其他元素。例如,如果你有两个其他元素执行此操作:

$completed_index -=2;

答案 2 :(得分:0)

有几种解决方案,具体取决于您可以更改调用代码的数量,以及是否保证start_doy字段按顺序填充(即,用户无法填写start_doy9,但不能填写start_doy2)

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

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

在PHP方面,这将转换为数组,因此您的处理可能是这样的:

<?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);

?>

答案 3 :(得分:0)

ALGO

$clean_post = array_filter( $_POST );

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

foreach ($clean_post as $doy => $value) {
...
}

只有非空值才会保留在$clean_post中(这可以通过PHP函数在C中更快地完成)。

-

你当前的算法:

  • 您可能还想检查0

ALGO

 $completed_index = -1;
 do {
   $completed_index++;
 } while ( ! empty($_POST['start_doy' . $completed_index]));

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