2013-02-05 103 views
1

我有一些非常丑陋的代码,我需要帮助来清理它。我相信肯定有更好的方法。 我有一个$ _POST变量,条目start_doy0,start_doy1,start_doy2等虽然循环测试替代

后来的条目我没有填写,我需要找到他们填充什么doy。 我不能以$ 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, 马特

+1

如果至少索引0存在,就可以开始从1而不是0。 – palindrom

+2

你''

应包含'<输入名称=“start_doy []”>'字段,从而你可以使用数组。 –

+0

如果用户完成start_doy0,start_doy2和start_doy3(但不是** start_doy1),则您的while循环会在到达start_doy2和start_doy3之前停止 - 因此您可能会错过任何东西。我不知道这是否相关...... :) – Tom

回答

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

?> 
+0

选项1总是更可取,但为什么要测试每个'$ _POST ['start_doy']'变量的值?这是不必要的。你可以通过ealesy检查它的大小来找出有多少sizeof($ _ POST ['start_doy'])''。因为,如果发布,它应该在那里;) – Peon

+1

@DainisAbols - 在foreach中测试的原因是检查值是否为空。 OP使用了empty() - 所以我认为可能有start_doy0 - > start_doy10,但可能只有用户输入的start_doy0 - > start_doy4。 – Tom

+0

那么......如果你想显示只有设置变量的计数,你也可以这样做:'echo array_sum(array_count_values($ _ POST ['start_doy'])) - (($ res = array_count_values($ _ POST [ 'start_doy']))?$ res ['']:0);' – Peon

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. 
+0

这是$ completed_index--这让我烦恼! – Matt

+0

那么......重命名为'$ ci'或类似的东西;) – Peon

0

可以使用“计数”功能如下:

$completed_index = count($_POST); 

然后删除其他元素。例如,如果您有其他两种元素做到这一点:

$completed_index -=2; 
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如果都没有)