php in_数组给出奇数结果

php in_数组给出奇数结果,php,arrays,Php,Arrays,我已经阅读了关于in_array的所有其他文章,但仍然不明白为什么我的文章会给出奇怪的结果。我从其他人那里继承了这段代码,不完全理解他们为什么做某些事情。当用户登录时,从数据库中抓取数据,其中一个字段是他们的“级别”。1是管理员,2是普通用户,等等。一旦从数据库抓取数据,我们将用户级别(存储为a:1:{i:0;s:1:2”)放入一个数组: $user_level = unserialize($this->result['user_level']); $_SESSION['unt']['u

我已经阅读了关于in_array的所有其他文章,但仍然不明白为什么我的文章会给出奇怪的结果。我从其他人那里继承了这段代码,不完全理解他们为什么做某些事情。当用户登录时,从数据库中抓取数据,其中一个字段是他们的“级别”。1是管理员,2是普通用户,等等。一旦从数据库抓取数据,我们将用户级别(存储为a:1:{i:0;s:1:2”)放入一个数组:

$user_level = unserialize($this->result['user_level']); 
$_SESSION['unt']['user_level'] = $user_level;
稍后,我们检查这是否是管理员:

error_log(print_r($_SESSION['abc']['user_level']));  //this is always "1"
if (in_array('1', $_SESSION['abc']['user_level'])) {   //should be yes, correct?

然而不知何故,即使会话变量为1,if语句的计算结果也不会为true。我缺少什么?

$\u会话['abc']['user\u level']似乎不是数组。看起来您需要以下选项之一

如果gettype($\u会话['abc']['user\u level'])为“整数”:

if ($_SESSION['abc']['user_level']) === 1) {
如果gettype($\u会话['abc']['user\u level'])为“字符串”:

if ($_SESSION['abc']['user_level']) === '1') {
如果gettype($\u SESSION['abc']['user\u level'])是'string',并且其值实际上包含引号:

if ($_SESSION['abc']['user_level']) === '"1"') {
如果是一个数组,则输出将具有此结构,而不仅仅是“1”:


尽管我注意到输入字符串中缺少右括号
}
,但我只是假设您可能在复制粘贴时遗漏了

a:1:{i:0;s:1:"2"
因此,数组中的
不是问题,但输入字符串是问题。
使用
display\u errors
设置
Off
尝试
取消序列化时,不会看到任何错误

您可以使用以下函数检查输入是否为要取消序列化的有效字符串:

然后是以下几点:

    $inputString = 'a:1:{i:0;s:1:"2";}';   //  Is valid and is holding one array of info
//  $inputString = 'a:1:{i:0;s:1:"2"';   //  Invalid as is missing a closing baracket }

if( ! is_serialized( $inputString ) )
{
    echo 'Is not serialized';
}
else
{
    $user_level = unserialize( $inputString );

    $_SESSION['unt']['user_level'] = $user_level;   //  Is an array

//  Note the second argument as was already pointed by @AsksAnyway
    error_log( print_r( $_SESSION['unt']['user_level'] , true ) );

    var_dump( in_array( '1' ,$_SESSION['unt']['user_level']) );

    var_dump( in_array( '2' ,$_SESSION['unt']['user_level']) );
}

有趣的是,当我使用gettype时,它会以数组的形式返回,所以上面的操作都不起作用!有趣。因此,即使gettype说它是一个数组,print\r也只打印数字1。两个var_转储返回为NULL。您的序列化字符串缺少结尾方括号
}
a:1:{i:0;s:1:2”
而你似乎关闭了
显示错误
。在那种情况下,我也得到了同样的结果:
1
null
null
。如果
显示错误
开启的,PHP将在
取消序列化时失败。我相应地更新了我的答案。我错过了e在我剪切和粘贴时结束花括号,并打开“显示错误”。Uours的解决方案工作得很好-谢谢!如果您正在传递结果而不是打印结果,则您的打印应该将true作为第二个参数,例如错误日志(打印($会话['abc']['user\u level'],true));
//  Copied from http://www.php.net/manual/en/function.unserialize.php
function is_serialized( $str )
{
    return( $str == serialize( false ) || @unserialize( $str ) !== false );
}
    $inputString = 'a:1:{i:0;s:1:"2";}';   //  Is valid and is holding one array of info
//  $inputString = 'a:1:{i:0;s:1:"2"';   //  Invalid as is missing a closing baracket }

if( ! is_serialized( $inputString ) )
{
    echo 'Is not serialized';
}
else
{
    $user_level = unserialize( $inputString );

    $_SESSION['unt']['user_level'] = $user_level;   //  Is an array

//  Note the second argument as was already pointed by @AsksAnyway
    error_log( print_r( $_SESSION['unt']['user_level'] , true ) );

    var_dump( in_array( '1' ,$_SESSION['unt']['user_level']) );

    var_dump( in_array( '2' ,$_SESSION['unt']['user_level']) );
}