【问题标题】:How to search $_POST for dynamic added input values?如何在 $_POST 中搜索动态添加的输入值?
【发布时间】:2020-09-08 14:08:26
【问题描述】:

我有一个表单,我可以在其中动态添加输入。

输入的名称开头相同,但末尾添加了一个数字:
<input type="number" name="number_of_floors_house_'+i+'">

现在,当我发布我的表单时,我想循环抛出这个输入。

所以我需要array_search($_POST['number_of_floors_house_%']之类的东西

或者找到所有以 'number_of_floors_house' 开头的 $POST['keys'] 并将它们循环抛出以获得它的值 :)

你能帮忙吗?

编辑
我试过了:

$houses_and_floors = array_search('number_of_floors_house_%', $_POST);
var_dump($houses_and_floors);

【问题讨论】:

标签: php arrays for-loop post search


【解决方案1】:

将您的输入更改为以下内容:

<input type="number" name="number_of_floors['+i+']">

方括号使输入作为数组提交,因此您可以更轻松地遍历所有值:

foreach($_POST['number_of_floors'] as $house_number => $value) {
    // $house_number will be whatever number was added to the form element.
    // $value is the actual input boxes value
}

【讨论】:

    【解决方案2】:

    你可以使用array_filter() 来挑选你真正想要的 $_POST 片段

    //fake up a post array
    $_POST = ['aa'=>1, 'bb'=>2, 'number_of_floors_house_1'=>2, 'number_of_floors_house_2'=>2,'number_of_floors_house_3'=>4];
    
    function picker($v, $k)
    {
        return strpos($k, 'number_of_floors_house') !== FALSE;
    }
    $res = array_filter($_POST, 'picker', ARRAY_FILTER_USE_BOTH);
    print_r($res);
    

    结果

    Array
    (
        [number_of_floors_house_1] => 2
        [number_of_floors_house_2] => 2
        [number_of_floors_house_3] => 4
    )
    

    【讨论】:

    • 虽然strpos 适用于这种情况,但进行显式前缀比较不是更安全吗?假设表单还包含 number_of_floors_houseworkview_number_of_floors_house 之类的键,我们会误报。
    • 另外,你为什么从array_filter回调中返回一个键值对? “如果回调函数返回 TRUE,则将数组中的当前值返回到结果数组中。” (手动) 似乎只需return strpos(... 就足够了?
    【解决方案3】:

    您可以使用array_filter()strncmp() 过滤匹配给定前缀的数组键:

    $prefix = 'number_of_floors_';
    $length = strlen($prefix);
    
    $nof = array_filter($_POST, function($key) use ($prefix, $length) {
        return strncmp($prefix, $key, $length) === 0;
    }, ARRAY_FILTER_USE_KEY);
    

    这将过滤所有具有已定义前缀的数组成员的帖子数据。请注意,我们正在检查函数外部的前缀长度以避免函数内部的冗余重复评估(每个数组成员执行一次)。当然,您也可以将其硬编码为单个用例并跳过上面的前导变量:

    $nof = array_filter($_POST, function($key) {
        return strncmp('number_of_floors_', $key, 17) === 0;
    }, ARRAY_FILTER_USE_KEY);
    

    ...它将每个键的前 17 个字符与定义的字符串进行比较。同样,您也可以使用substr() 代替strncmp() 执行此操作,并使用return substr($key, 0, $length) === $prefix 作为过滤条件。我在这个例子中选择了前者,因为它是一个明确地用于“前 n 个字符的二进制安全字符串比较”的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多