2011-04-13 140 views
0

我有一個使用輸入來創建和排列的表單。輸入不是全部必需的,但至少有一個是。清除表單中的數組元素

<form method="post" action="process.php"> 
    <input type="text" name="MAC[]" maxlength="12" /> 
    <input type="text" name="MAC[]" maxlength="12" /> 
    <input type="text" name="MAC[]" maxlength="12" /> 
    <input type="text" name="MAC[]" maxlength="12" /> 
    <input class="submitbg" type="submit" value="Register" name="submit"/> 
</form> 

現在在process.php我想通過數組循環去除兩種類型的特殊字符:;然後讓全部大寫,並確認只有12個字符,然後序列化arrray。

$my_array = $_POST['MAC']; 
foreach ($my_array as $val){ 
    $val = strtoupper($val); 
    $val = str_replace(";","",$val); 
    $val = str_replace(":","",$val); 
    $val = trim($val); 
    if (strlen($val) != 12)){ 
     $valid = false; 
     $error = "Your MAC address is not 12 characters long"; 
    } 
} 
$mac_addresses = serialize($my_array); 

// if valid is not false do something with the cleaned up array. 

的問題:

  1. 將我的foreach循環保存更新的值回陣列?
  2. 如何檢查以確保至少有一個數組值?

回答

1
  1. 有什麼問題嗎?
  2. 你可以做str_replace(array(';',':'),'',$val);
  3. 它通常是在同一個變量,由於涉及數據處理的開銷,你最終會削減做其他處理之前更好地trim
  4. 考慮在錯誤使用break,如果你在一個暫停執行錯誤。
  5. 你並沒有對$my_array進行任何更新。

考慮做:

foreach($my_array as &$val) 

您通過引用傳遞所以$所有更新VAL發生在實際的數組。或者:

foreach($my_array as $key=>$val){ 
    $my_array[$key]=trim($my_array[$key]); 

您也可以嘗試爲您的清理數據創建一個新數組,然後覆蓋您的舊數組。這一切都取決於需求。

+0

問題是我的foreach循環會將更新後的值保存到數組中嗎?以及如何檢查,以確保至少有一個數組值 – Denoteone 2011-04-13 18:14:55

+0

嗯,這取決於,你可以做'!empty($ array)'。但是如果你知道這些鍵是由'[]'自動設置的,你可以執行'isset($ array [0])'。要用這個問題更新你的帖子,因爲它對我來說似乎更清晰。 – Khez 2011-04-13 18:18:39

1

要檢查,看看是否至少有一個,你應該能夠使用if(count($my_array) > 1)

1

我也不理解你的問題。 但是,看着你的代碼,你可能會感覺到最終沒有發生你的POST變量。 你是對的! :-)

您在腳本末尾清理完的數組恰好是原始數組。 您可能想要實現如下目標:如果clean數組包含12個字符,則它將包含清除的值。

$my_array = $_POST['MAC']; 
$my_clean_array = $_POST['MAC']; 
foreach ($my_array as $val) { 
     $val = strtoupper($val); 
     $val = str_replace(";","",$val); 
     $val = str_replace(":","",$val); 
     $val = trim($val); 
     if (strlen($val) != 12)) { 
      $valid = false; 
      $error = "Your MAC address is not 12 characters long"; 
     } 
     else { 
      $my_clean_array[] = $val; 
     } 
} 
$mac_addresses = serialize($my_clean_array); 
+0

哇 - 我可以評論我自己的答案;-) 看看這個:[php-validate-mac-address-using-regex](http://www.usermadetutorials.com/2010/07/php使用-validate-MAC地址-正則表達式/) – HBublitz 2011-04-13 18:06:36

2

我只是不知道如果我的foreach循環更新,並重新保存的值每次

如果要保存的值,你應該改變你的循環,這樣它看起來是這樣的:

foreach ($my_array as $idx => $val) { 
    ... 
    $my_array[$idx] = $val; 
} 

當然,你也可以適當的值保存到一個單獨的乾淨數組,然後你會在我進一步使用你的應用程序。

我還必須檢查以確保至少有一個條目。

理論上,您不必檢查數組是否包含在foreach中使用該數組的元素。你需要檢查的事情是變量是否包含數組。假設MAC[]字段沒有提交給服務器,您將首先收到警告(現在也可能是錯誤),因爲您正在查找數組中不存在的索引。其次,如果您的陣列(或任何Traversable)適用於您的foreach,則會發生錯誤。你可以用下面的檢查解決此問題:

if (!empty($_POST['MAC'])) { 
    $my_array = $_POST['MAC']; 
    if (!is_array($my_array)) { 
    // throw some error. 
    } 
} 

當然你想通過提供一個驗證框架,你可以提供驗證規則和一些輸入驗證做更結構化的方式你輸入這個驗證框架將處理驗證,最重要的是爲您處理錯誤消息。

其實也可以改變最後if語句來閱讀:

if (!is_array($my_array) && !($my_array instanceof Traversable)) 

如果你想確保$ my_array也就是說包含的東西你可以用foreach穿越過來。令人討厭的是內置數組()不是Traversable,雖然可以理解,但令人討厭。