2011-10-08 41 views
3

我试图检查用户提交的数据,从$_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)自己的方法。

+0

你尝试的print_r($ _ POST)? – stivlo

+0

请参阅'编辑#2'以获得调试结果。 – daGrevis

+0

in_array一次只能测试一个值in_array('title',$ array_keys)会起作用。看到我更新的答案。 – stivlo

回答

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

in_array(阵列( 'X', 'Y', 'Z'),$ _ POST) ,但它不起作用(它返回假时,它应该返回true)

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

检查一个阵列中的

存在相反,你想检查数组的键。获取与array_keys的所有密钥,然后使用in_array。

使用in_array,您一次只能测试一个值,但并不是像您正在尝试的那样的整个值。

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

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

它将发现含有标题,蛞蝓和评论的数组,这是不是你想要的按键排列的一个元素

0

首先:

我不想使用类似isset($ _ POST [ 'X'],$ _ POST [ 'Y'],$ _ POST [ 'Z']),因为每次我需要重写$ _POST并且它看起来不可读。

你不应该改变超级全局之一;)

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

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

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

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

+0

所以...我需要创建我的自定义函数来检查键是否在“主”数组中,对吗? – daGrevis

+0

是的,如果你认为它会让你的程序比使用isset($ _ POST ['key1'],$ _POST ['key2']等)更容易理解/清洁。 – ontrack

+0

看看'编辑#3'。我为它创建了自己的方法。 :) – daGrevis

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

    return $default; 
} 
0

如果你想确保在多重键的存在,然后array_diff可能适用:

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

您可能也有兴趣array_intersect_uassoc

-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 
+0

这是我第一次想到当我注意到我的代码不能按预期工作。这意味着我需要为它创建自定义方法。 – daGrevis

0

@Eric是正确的,试试这个 -

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

这不是我的意思! – Eric

相关问题