如何从 $_POST 获取键值以及我在其中包含数据的值?

How do I get the key values from $_POST and also that value in which i have field the data?

我有一个表格,其中有 150 个字段,我只想在提交时填写表格的电子邮件中发送该键和值,而不是所有值。

目前在“$_POST”上显示所有键和值,但我只想要我在输入文本中填写的那个值。

编辑

在提交表单并打印 $_POST 时,我打印的是这样的

[a] => 11 
[b] => 11 
[c] => 11 
[d] => 11 
[d] => 
[e] => 
[f] => 
[d] => 

但是我想要那个键和值都有数据

foreach($_POST as $key=>$value) {
    if($value!='') {
        $post[$key] = $value;
    }
}

我想这可能对你有帮助。 $post 将拥有您需要的所有数据。

您需要保留一个额外的隐藏输入字段来存储表单中每个输入元素的旧值。因此,如果您的表单有 150 个输入元素,那么还会有另外 150 个隐藏字段,并且表单中总共有 300 个字段(150 个在页面上可见,其余 150 个对用户不可见)。

最初,当页面加载时,输入元素和隐藏元素将具有相同的数据,但用户只能更改可见输入元素并可以提交表单。

在 PHP 脚本中,这里形成 post 数据,您需要比较输入元素与隐藏元素的值。如果它们不相同,则在新的临时数组中添加新值。发送电子邮件时将使用这个新的临时数组。

示例:

表格

field_1
hidden_field_1

field_2
hidden_field_2

field_3
hidden_field_3

PHP

loop on $_POST array {
    if ( hidden_field_1 != field_1) {
        // Store field_1 in temp to send it in email
    }
}

假设我正确理解了您的要求,您可以在一个简单的 foreach 循环中执行此操作

foreach ($_POST as $key => $val) {
    if ( $key == 'submit' ) {
        continue;
    }
    echo $key . " = " . $val . '<br>';
}

如果有多个字段,那么您可以创建一个忽略列表并针对每个字段名称输入文字。

$ignore_list = ['submit', 'other_field'];

foreach ($_POST as $key => $val) {
    if ( in_array($key, $ignore_list ) {
        continue;
    }
    echo $key . " = " . $val . '<br>';
}

当然你可以让生成的输出看起来像你想要的我只是使用了一个简单的 echo 用于演示目的。

考虑您的 post 数据如下:

$_POST = array(
    'a' => '11', 
    'b' => 11, 
    'c' => 11, 
    'd' => null, 
    'e' => null, 
);

$to_delete = array(0 => false);
print_r(array_diff($_POST, $to_delete));

工作代码在这里:https://3v4l.org/BZVQn

作为 array_filter 将如何改变最终 POST 数组的示例,请考虑以下演示:

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>multiple fields, non-empty only selected</title>
    </head>
    <body>
        <form method='post'>
            <?php
                /* for brevity only 10 results */
                for( $i=1; $i <= 10; $i++ ){
                    $checked = rand(0,5)==1 ? $i : '';
                    echo "<input type='hidden' name='field_$i' value='$checked' />";
                }

                if( $_SERVER['REQUEST_METHOD']=='POST'){
                    /* results without filtering */
                    printf('<pre>%s</pre>',print_r( $_POST, 1 ) );


                    /* results AFTER filtering */
                    $_POST=array_filter( $_POST );
                    printf('<pre>%s</pre>',print_r( $_POST, 1 ) );
                }
            ?>
            <input type='submit' />
        </form>
    </body>
</html>

示例输出:

Array
(
    [field_1] => 1
    [field_2] => 
    [field_3] => 3
    [field_4] => 
    [field_5] => 5
    [field_6] => 
    [field_7] => 
    [field_8] => 
    [field_9] => 
    [field_10] => 10
)
Array
(
    [field_1] => 1
    [field_3] => 3
    [field_5] => 5
    [field_10] => 10
)

两个 print 语句的输出有很大不同 - array_filter 的使用已经从数组中删除了所有空表单字段 - 从这一点来看,数组数据的处理是微不足道的foreach 或其他方法,例如 array_walkarray_map