5

我正在尝试检查用户提交的数据 from$_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).

4

8 回答 8

9

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);
于 2011-10-08T16:40:16.190 回答
1

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

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

于 2011-10-08T16:41:32.523 回答
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))

它将找到键数组的一个元素,该元素包含一个带有标题、slug 和注释的数组,这不是您想要的。

于 2011-10-08T16:40:45.240 回答
0

首先:

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

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

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

in_array(array('x', 'y', 'z'), array_key($_POST))
于 2011-10-08T16:41:29.850 回答
0
function getPost( $index, $default = '' )
{
    if ( isset( $_POST[ $index ] ) )
    {
        return $_POST[ $index ];
    }

    return $default;
}
于 2011-10-08T16:44:12.790 回答
0

如果要确保存在多个键,则array_diff可能适用:

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

您可能还对array_intersect_uassoc.

于 2011-10-08T16:45:52.537 回答
0

@Eric 是对的,试试这个 -

in_array(array('title', 'slug', 'content'), array(array_keys($_POST)))
于 2011-10-08T17:00:58.050 回答
-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
于 2011-10-08T16:46:44.957 回答