清理表单中的数组元素

时间:2011-04-13 17:44:00

标签: php html arrays

我有一个使用输入来创建和数组的表单。输入并非都是必需的,但至少有一个是。

<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. 如何检查以确保至少有一个数组值?

4 个答案:

答案 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)

  1. 问题是什么?
  2. 您可以str_replace(array(';',':'),'',$val);
  3. 在对同一个变量进行其他处理之前,trim通常会更好,因为处理最终会削减的数据所涉及的开销
  4. 如果您在一个错误上暂停执行,请考虑对错误使用break
  5. 您实际上并未对$my_array进行任何更新。
  6. 考虑一下:

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