我有一个使用输入来创建和数组的表单。输入并非都是必需的,但至少有一个是。
<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.
问题:
答案 0 :(得分:2)
我只是不确定我的foreach循环是否每次更新并重新保存值
如果要保存值,则应更改循环,使其看起来像这样:
foreach ($my_array as $idx => $val) {
...
$my_array[$idx] = $val;
}
当然,您也可以将正确的值保存到单独的 clean 数组中,然后在应用程序中进一步使用该数组。
我还必须检查以确保至少有一个条目。
理论上,您不必检查数组是否包含在foreach中使用该数组的元素。您需要检查的是变量是否包含数组。假设MAC[]
字段未提交给服务器,您首先会收到警告(现在也可能是错误),因为您正在查找数组中一些不存在的索引。其次,你会在foreach
上收到错误,因为它适用于数组(或任何Traversable)。您可以通过以下检查来解决此问题:
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
遍历的内容。讨厌的一点是内置的array()不是Traversable
,虽然可以理解但很讨厌。
答案 1 :(得分:1)
要查看您是否至少有一个,您应该可以使用if(count($my_array) > 1)
答案 2 :(得分:1)
str_replace(array(';',':'),'',$val);
trim
通常会更好,因为处理最终会削减的数据所涉及的开销break
。$my_array
进行任何更新。考虑一下:
foreach($my_array as &$val)
您通过引用传递,因此$ val的所有更新都发生在实际数组中。或者:
foreach($my_array as $key=>$val){
$my_array[$key]=trim($my_array[$key]);
您还可以尝试为已清理的数据创建一个新数组,然后覆盖旧数组。这一切都取决于需求。
答案 3 :(得分:1)
我也不理解你的问题/问题。 但是,查看您的代码,您可能会感觉到最终没有任何事情发生在您的POSTed vars上。 你是对的! :-)
脚本末尾的已清理数组与原始数组完全相同。 您可能希望实现如下所示: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);