[英]Why does in_array() not work on $_POST?
我正在尝试检查用户提交的数据,来自$_POST
,至少具有与我传递的数组相同的元素。 我这样做是因为我稍后会通过调用$_POST['element']
来使用这些元素,我不喜欢有关该元素的错误不存在(未设置)。 :)
我不想使用像isset($_POST['x'], $_POST['y'], $_POST['z'])
这样的东西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)
。
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);
因为in_array
检查针是否在阵列中。 请参见手册页的示例#3。 array_key_exists
不能使用键作为第一个参数,因为数组对于数组作为键无效。
你想要像all_in_array(array $needles, array $haystack);
或array_all_keys_exists(array $keys, array $search);
返回是否所有元素都在数组中。 你可以自己实现这样的东西,或者在这里寻求更多的帮助。
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))
它将找到keys数组的一个元素 ,其中包含一个带有title,slug和comment的数组,这不是你想要的。
首先:
我不想使用像isset这样的东西($ _ POST ['x'],$ _POST ['y'],$ _POST ['z'])因为每次我需要重写$ _POST而且它似乎也不可读。
你永远不应该改变其中一个超级全局变量;)
但是, in_array()
搜索值而不搜索键
in_array(array('x', 'y', 'z'), array_key($_POST))
function getPost( $index, $default = '' )
{
if ( isset( $_POST[ $index ] ) )
{
return $_POST[ $index ];
}
return $default;
}
如果要确保存在多个密钥,则array_diff
可能适用:
!array_diff(array('title', 'slug', 'content'), array_keys($_POST))
您可能也对array_intersect_uassoc
感兴趣。
@Eric是对的,试试这个 -
in_array(array('title', 'slug', 'content'), array(array_keys($_POST)))
你不明白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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.