【问题标题】:Why does in_array() not work on $_POST?为什么 in_array() 在 $_POST 上不起作用?
【发布时间】:2011-10-08 16:37:51
【问题描述】:

我正在尝试检查来自$_POST 的用户提交的数据是否至少具有与我传递的数组相同的元素。我这样做是因为稍后我将通过调用$_POST['element'] 来使用这些元素,而且我不喜欢关于该元素不存在(未设置)的错误。 :)

我不想使用像isset($_POST['x'], $_POST['y'], $_POST['z']) 这样的东西,因为每次我都需要重写$_POST,而且它似乎也无法阅读。

我尝试使用in_array(array('x', 'y', 'z'), $_POST),但它不起作用(它在应该返回true 时返回false)。任何想法如何使它工作? :) 我确定我有空字符串$_POST['x']$_POST['y']$_POST['z']。我什至尝试将软管三个 $_POST 元素的值更改为空字符串以外的其他值 - 仍然......没有按预期工作。 :(

感谢您的建议! :)

编辑:

刚刚发现in_array() 检查的是值,而不是键。然后,我尝试这样做......

in_array(array('title', 'slug', 'content'), array_keys($_POST))

仍然返回false。怎么会这样? ;/

编辑#2:

好的,这是调试的结果...

传入$_POST

array(3) {
    ["title"]=>
    string(0) ""
    ["slug"]=>
    string(0) ""
    ["content"]=>
    string(0) ""
}

array_keys($_POST)的结果:

array(3) {
    [0]=>
    string(5) "title"
    [1]=>
    string(4) "slug"
    [2]=>
    string(7) "content"
}

in_array(array('title', 'slug', 'content'), array_keys($_POST)) 的结果:

bool(false)

问题...为什么是false?据我所知,我都做对了。

编辑#3:

最后,我创建了自己的方法Arr::keys_exists($keys, $array)

【问题讨论】:

  • 您是否尝试过 print_r($_POST) ?
  • 调试结果参见“Edit #2”。
  • in_array 一次只能测试一个值 in_array('title', $array_keys) 会起作用。查看我的更新答案。

标签: php arrays post isset


【解决方案1】:

in_array() 检查数组中是否存在,而不是。如果您想检查是否存在密钥,那么您需要类似...

in_array('x', array_keys($_POST));

或者更简单的...

array_key_exists('x', $_POST);

如果您想一次检查多个键:

$required_keys = array('x'=>1, 'y'=>1, 'z'=>1);
$missing_keys = array_diff_key($required_keys, $_POST);
$missing_keys_count = count($missing_keys);

【讨论】:

    【解决方案2】:

    因为in_array 检查针是否准确地在数组中。请参阅手册页的示例 #3。 array_key_exists 不能将键用作第一个参数,因为数组不适用于作为键的数组。

    你想要像all_in_array(array $needles, array $haystack);array_all_keys_exists(array $keys, array $search); 这样的东西,它返回是否所有元素都在数组中。您可能可以自己实现类似的东西,或者在这里寻求更多帮助。

    【讨论】:

    • 所以...我需要创建我的自定义函数来一一检查键是否在“主”数组中,对吧?
    • 是的,如果你认为它会让你的程序比使用 isset($_POST['key1'], $_POST['key2'], etc...); 更容易理解/更简洁。
    • 看看“编辑#3”。我为此创建了自己的方法。 :)
    • 看起来不错。您没有必须使用严格的=== 检查,因为array_key_exists 只返回true 或false。但它有什么问题。
    • 我使用严格的类型检查只是因为该函数返回 only 布尔值。对我来说看起来更清晰! :)
    【解决方案3】:

    首先:

    我不想使用 isset($_POST['x'], $_POST['y'], $_POST['z']) 之类的东西,因为每次我都需要重写 $_POST 并且似乎也不可读。

    您永远不应该更改超级全局变量之一;)

    但是,in_array() 搜索值而不是键

    in_array(array('x', 'y', 'z'), array_key($_POST))
    

    【讨论】:

      【解决方案4】:
      function getPost( $index, $default = '' )
      {
          if ( isset( $_POST[ $index ] ) )
          {
              return $_POST[ $index ];
          }
      
          return $default;
      }
      

      【讨论】:

        【解决方案5】:

        如果您想确保存在多个键,那么array_diff 可能适用:

        !array_diff(array('title', 'slug', 'content'), array_keys($_POST))
        

        您可能还对array_intersect_uassoc 感兴趣。

        【讨论】:

          【解决方案6】:

          in_array(array('x', 'y', 'z'), $_POST),但是它不起作用(它应该返回true时返回false)

          不,不应该。阅读in_array的手册。

          检查数组中是否存在

          相反,您想检查数组键。用array_keys获取所有key,然后使用in_array。

          使用 in_array,您一次只能测试一个值,但不能像您尝试的那样测试整个值数组。

          换句话说,如果你这样做:

          in_array(array('title', 'slug', 'content'), array_keys($_POST))
          

          它会在keys数组中找到一个元素,其中包含一个带有title、slug和comment的数组,这不是你想要的。

          【讨论】:

            【解决方案7】:

            @Eric 是对的,试试这个 -

            in_array(array('title', 'slug', 'content'), array(array_keys($_POST)))
            

            【讨论】:

            • 我完全不是这个意思!
            【解决方案8】:

            你不懂in_array

            $a = array(
                'x' => 1
            );
            echo in_array(array('x', 'y', 'z'), $a); // false
            
            $a['an array'] = array('x', 'y', 'z');
            echo in_array(array('x', 'y', 'z'), $a); // true
            

            【讨论】:

            • 当我注意到我的代码没有按预期工作时,我首先想到的是。这意味着我需要为其创建自定义方法。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-19
            • 2018-02-01
            相关资源
            最近更新 更多