[英]php in_array giving odd result
我已經閱讀了有關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?
但是,即使SESSION變量為1,if語句也永遠不會評估為真。我缺少什么?
$_SESSION['abc']['user_level']
似乎不是數組。 看起來您想要以下之一。
如果gettype($ _ SESSION ['abc'] ['user_level'])是'integer':
if ($_SESSION['abc']['user_level']) === 1) {
如果gettype($ _ SESSION ['abc'] ['user_level'])是'string':
if ($_SESSION['abc']['user_level']) === '1') {
如果gettype($ _ SESSION ['abc'] ['user_level'])是'string'並且其值實際上包含引號:
if ($_SESSION['abc']['user_level']) === '"1"') {
如果是數組,則輸出將具有以下結構,而不僅僅是“ 1”:
Array
(
[0] => 1
)
即使我注意到輸入字符串中缺少右括號}
但我只是假設您在復制粘貼時可能已經錯過了。
a:1:{i:0;s:1:"2"
所以in_array
不是問題,但是您的輸入字符串是問題。
將display_errors
設置為Off
時,嘗試反unserialize
時不會看到任何錯誤。
您可以使用以下函數檢查輸入是否為要反序列化的有效字符串:
// 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']) );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.