Php 清理窗体中的数组元素

Php 清理窗体中的数组元素,php,html,arrays,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[]" m

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

<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>
问题是:

  • 我的foreach循环是否会将更新的值保存回数组中
  • 如何检查以确保至少有一个数组值

  • 若要检查是否至少有一个,您应该能够使用
    if(count($my_数组)>1)
    若要检查是否至少有一个,您应该能够使用
    if(count($my_数组)>1)

  • 问题是什么
  • 您可以执行str_替换(数组(“;”,“:”),“$val”)
  • 通常最好在对同一变量进行其他处理之前进行
    trim
    ,因为处理数据的开销最终会减少
  • 如果在一个错误上停止执行,请考虑对错误使用
    break
  • 您并没有对
    $my\u array
    进行任何更新
  • 考虑做:

    foreach($my_array as &$val)
    
    您通过引用传递,因此对$val的所有更新都发生在实际数组中。或:

    foreach($my_array as $key=>$val){
        $my_array[$key]=trim($my_array[$key]);
    
    您还可以尝试为经过清理的数据创建一个新数组,然后重写旧数组。这完全取决于需要

  • 问题是什么
  • 您可以执行str_替换(数组(“;”,“:”),“$val”)
  • 通常最好在对同一变量进行其他处理之前进行
    trim
    ,因为处理数据的开销最终会减少
  • 如果在一个错误上停止执行,请考虑对错误使用
    break
  • 您并没有对
    $my\u array
    进行任何更新
  • 考虑做:

    foreach($my_array as &$val)
    
    您通过引用传递,因此对$val的所有更新都发生在实际数组中。或:

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

    您还可以尝试为经过清理的数据创建一个新数组,然后重写旧数组。这完全取决于需要。

    我也不理解你的问题。 但是,看看你的代码,你可能会觉得最终你发布的变量没有发生任何事情。 你说得对!:-)

    脚本末尾清理的数组与原始数组完全相同。 您可能希望实现这样的效果:如果干净数组包含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);
    

    我也不理解你的问题。 但是,看看你的代码,你可能会觉得最终你发布的变量没有发生任何事情。 你说得对!:-)

    脚本末尾清理的数组与原始数组完全相同。 您可能希望实现这样的效果:如果干净数组包含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);
    
    我只是不确定我的foreach循环是否每次都更新并重新保存这些值

    如果要保存这些值,应更改循环,使其看起来如下所示:

    foreach ($my_array as $idx => $val) {
      ...
      $my_array[$idx] = $val;
    }
    
    当然,您也可以将适当的值保存到一个单独的干净数组中,然后在应用程序中进一步使用该数组

    我还必须检查以确保至少有一个条目

    理论上,在foreach中使用数组时,不必检查数组是否包含元素。但需要检查的是变量是否包含数组。假设
    MAC[]
    字段没有提交到服务器,您首先会收到一条警告(现在也可能是错误),因为您正在查找数组中不存在的索引。其次,您的
    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_数组中包含可以使用
    foreach
    遍历的内容,就可以这样做。令人讨厌的是,内置数组()不可
    遍历
    ,虽然可以理解,但令人讨厌

    我只是不确定我的foreach循环是否每次都更新并重新保存这些值

    如果要保存这些值,应更改循环,使其看起来如下所示:

    foreach ($my_array as $idx => $val) {
      ...
      $my_array[$idx] = $val;
    }
    
    当然,您也可以将适当的值保存到一个单独的干净数组中,然后在应用程序中进一步使用该数组

    我还必须检查以确保至少有一个条目

    理论上,在foreach中使用数组时,不必检查数组是否包含元素。但需要检查的是变量是否包含数组。假设
    MAC[]
    字段没有提交到服务器,您首先会收到一条警告(现在也可能是错误),因为您正在查找数组中不存在的索引。其次,您的
    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_数组中包含可以使用
    foreach
    遍历的内容,就可以这样做。令人讨厌的是,内置数组()不可
    遍历
    ,虽然可以理解,但令人讨厌

    哇-我可以评论我自己的答案;-)看看这个:哇-我可以评论我自己的答案;-)看看这个:问题是我的foreach循环是否会将更新的值保存回数组中?以及如何检查以确保存在