2013-02-05 71 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如果都沒有)