Php 为什么in_array()在$POST上不起作用?

Php 为什么in_array()在$POST上不起作用?,php,arrays,post,isset,Php,Arrays,Post,Isset,我正在尝试检查用户提交的数据(来自$\u POST)是否至少具有与我传递的数组相同的元素。我这样做是因为我稍后将通过调用$\u POST['element']来使用这些元素,我不喜欢关于该元素的错误不存在(未设置)。:) 我不想使用像isset($\u POST['x'],$\u POST['y'],$\u POST['z'])这样的东西,因为每次我都需要重写$\u POST,而且它看起来也不可读 我试图在数组中使用(数组('x','y','z'),$\u POST),但它不起作用(当它应该返回

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

我不想使用像isset($\u POST['x'],$\u POST['y'],$\u POST['z'])这样的东西,因为每次我都需要重写
$\u POST
,而且它看起来也不可读

我试图在数组中使用
(数组('x','y','z'),$\u POST)
,但它不起作用(当它应该返回
true时,它返回
false
)。有什么办法可以让它工作吗?:)我确信我有空字符串,如
$\u POST['x']
$\u POST['y']
$\u POST['z']
。我甚至尝试将hose三个
$\u POST
元素的值更改为空字符串以外的值-仍然。。。没有按预期工作(

谢谢你的建议!:)

编辑:

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

在数组中(数组('title','slug','content'),数组键($\u POST))

但是,它仍然返回
false
。怎么会这样/

编辑#2:

好的,下面是调试的结果

传入的
$\u POST

array(3) {
    ["title"]=>
    string(0) ""
    ["slug"]=>
    string(0) ""
    ["content"]=>
    string(0) ""
}
array(3) {
    [0]=>
    string(5) "title"
    [1]=>
    string(4) "slug"
    [2]=>
    string(7) "content"
}
bool(false)
数组键($\u POST)的结果

在数组(数组($标题、'段塞'、'内容')、数组键($发布))中的
结果

问题是。。。为什么它是假的?据我所知,我都做对了

编辑#3:

最后,我创建了自己的方法,名为。

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);
在数组中(数组('x','y','z'),$\u POST),但它不起作用(当它应该返回true时,它返回false)

不,不应该。请阅读本手册

检查数组中是否存在

相反,您希望检查数组键。使用获取所有密钥,然后在_数组中使用

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

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

in_array(array('title', 'slug', 'content'), array_keys($_POST))
它需要在keys数组中找到一个元素,该元素包含一个包含title、slug和comment的数组,这不是您想要的。

首先:

我不想使用像isset($\u POST['x'],$\u POST['y'],$\u POST['z'])这样的东西,因为每次我都需要重写$\u POST,它看起来也不可读

您不应该更改其中一个超级全局变量;)

但是,
在数组()中搜索值,而不是键

in_array(array('x', 'y', 'z'), array_key($_POST))
因为会检查指针是否准确地位于阵列中。请参见手册页面的示例#3。无法使用键作为第一个参数,因为数组的值对于作为键的数组无效


您需要类似于
数组中的所有数组(数组$niners,数组$haystack)
数组\u所有\u键\u存在(数组$keys,数组$search)。您可能可以自己实现类似的功能,或者在此处寻求更多帮助。

如果您希望确保存在多个键,则可能适用于:

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

    return $default;
}
!array_diff(array('title', 'slug', 'content'), array_keys($_POST))
你可能也对它感兴趣。

你不明白


@埃里克是对的,试试这个-

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

您是否尝试打印_r($_POST)?有关调试结果,请参阅“编辑#2”。in#u数组一次只能测试一个值,in#u数组($title',array_key)将起作用。看看我的最新答案。所以。。。我需要创建一个自定义函数来逐个检查键是否在“master”数组中,对吗?是的,如果您认为它比使用isset($\u POST['key1'],$\u POST['key2']等)更容易理解/更简洁的话;请看“编辑#3”。我为此创建了自己的方法。:)看起来不错。您不必使用严格的
==
检查,因为array\u key\u exists只返回true或false。但它并没有错,我使用严格的类型检查只是因为该函数只返回布尔值。我觉得更清楚了!:)当我注意到我的代码没有按预期工作时,这是我想到的第一件事。这意味着我需要为它创建自定义方法。这根本不是我的意思!
in_array(array('title', 'slug', 'content'), array(array_keys($_POST)))