【问题标题】:Can I filter an $_GET array in a foreach loop我可以在 foreach 循环中过滤 $_GET 数组吗
【发布时间】:2014-02-03 13:42:46
【问题描述】:

我在内部数据库中有一个不被公众使用或访问的表单。

该表单具有从 SQL 数据库生成的项目列表。 每个项目都有一个复选框以选择是否要将其带到下一页。 它永远不是固定数量的项目,取决于正在访问的客户/表。 复选框名称是在 SQL select while 循环中生成的,因此复选框名称值会上升“num1、num2、num3”等。

在我的表单输出中:

foreach ($_get as $result){
echo $result;
}

这会回显整个 %_get 数组的值。

我想对其进行过滤以仅显示包含“num”的 $_get 值,因此它不会循环查找 $_get 数组中可能存在的任何其他内容。

例如,我希望它:

echo %_get['num1];
echo %_get['num2];
echo %_get['num3];
/* etc.. looping the amount of times the string "num" is used and not looping if for
example it didn't contain "num" like %_get['egg'] if it existed */

我希望这是有道理的。

如果有更好的方法,我愿意接受任何解决方案或替代方法。

非常感谢, 灰

【问题讨论】:

    标签: php html mysql foreach get


    【解决方案1】:

    foreach 循环可以选择 $_GET 数组项的键和值,因此您可以检查键是否以 num 开头。

    foreach($_GET as $key => $value) {
        if(strpos($key, 'num') === 0) {
            echo $value;
        }
    }
    

    我强烈建议过滤和验证任何输入(GET、POST 等),尤其是在生产系统上。 http://www.php.net/manual/en/function.filter-input.php 对于初学者。

    【讨论】:

    • 这非常适合我想做的事情。感谢您提供有关输入验证的其他信息 :)
    • 只是指出这段代码不能按现在的样子工作,请注意$key$_key...这是一个陷阱!
    【解决方案2】:

    你只是想做这样的事情吗:

    foreach($_GET as $key=>$val){
        if(false !== stripos($key, 'num')){
            echo $_GET[$key];
        }
    }
    

    这是循环完整的 _GET 数组并检查键是否包含字符串 num。我使用了不区分大小写的条带,如果您希望它区分大小写,请将 stripos 替换为 strpos

    检查显式 false 的原因是 stripos 返回字符串位置,如果找到该字符串,则该位置可以为零。 PHP 中的零大致等于 false。通过使用!== 而不是!=,我们仅在结果不是实际错误(即根本找不到)时才匹配结果。

    请注意,您确实需要对真实世界的代码进行某种输入过滤和输出转义。

    【讨论】:

    • 检查 0 绝对没问题,因为 0 意味着在大海捞针的起点找到了针。 ;)
    • 没错,因此检查以确保它不是假的,但此代码允许为零
    【解决方案3】:

    试试这个:

    foreach ($_GET as $key=>$result){
       if(substr($key, 0, 3) == 'num') {
         echo $result;
       }
    }
    

    循环所有 $_GET 全局数组并仅过滤以 'num' 开头的数组并回显这些值。

    【讨论】:

    • 你应该给出的不仅仅是代码,请解释代码
    • 我同意帕特里克的观点。 strpos 也是一种检查字符串是否以另一个字符串开头的更快方法。 stackoverflow.com/questions/5821483/…
    【解决方案4】:

    您可以使用带有回调的 array_filter 来过滤掉数组中的项目。

    http://uk3.php.net/array_filter
    

    例如:

    function even($var)
    {
        // returns whether the input integer is even
        return(!($var & 1));
    }
    
    $array = array(6, 7, 8, 9, 10, 11, 12);
    
    print_r(array_filter($array, "even"));
    
    $filteredArray = array_filter($array, "even");
    

    这将根据奇/偶过滤掉。您可以将回调更改为套件。

    【讨论】:

    • 对于 OP 的要求,这是一个矫枉过正的解决方案。请亲一下。
    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 2022-06-29
    • 2021-07-15
    • 2017-06-25
    • 2016-06-11
    • 2021-02-14
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多