为什么in_array()不适用于$ _POST?

时间:2011-10-08 16:37:52

标签: php arrays post isset

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

我不想使用isset($_POST['x'], $_POST['y'], $_POST['z'])这样的内容,因为每次我需要重写$_POST时,它似乎也不可读。

我尝试使用in_array(array('x', 'y', 'z'), $_POST),但它不起作用(当它应该返回false时返回true)。任何想法如何使这项工作? :)我确定我的空字符串为$_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)

8 个答案:

答案 0 :(得分:7)

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);

答案 1 :(得分:1)

因为in_array检查针是否在阵列中。请参见手册页的示例#3。 array_key_exists无法使用键作为第一个参数,因为数组对于数组作为键无效。

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

答案 2 :(得分:0)

  

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

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

  

检查数组中是否存在

相反,您需要检查数组键。获取array_keys的所有密钥,然后使用in_array。

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

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

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

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

答案 3 :(得分:0)

首先:

  

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

你永远不应该改变其中一个超级全局变量;)

但是,in_array()会搜索值而非键

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

答案 4 :(得分:0)

function getPost( $index, $default = '' )
{
    if ( isset( $_POST[ $index ] ) )
    {
        return $_POST[ $index ];
    }

    return $default;
}

答案 5 :(得分:0)

如果您想确保存在多个密钥,则array_diff可能适用:

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

您可能也对array_intersect_uassoc感兴趣。

答案 6 :(得分:0)

@Eric是对的,试试这个 -

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

答案 7 :(得分:-1)

您不理解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