2010-07-14 178 views
1

我有一個包含以下字符串的會話變量。php從字符串中提取值

a:2:{s:7:"LoginId";s:32:"361aaeebef992bd8b57cbf390dcb3e8d";s:8:"Username";s:6:"aaaaaa";} 

我想提取用戶名「aaaaaa」的值。任何人都可以建議更簡單/更有效的方式

$session_data = unserialize($_SESSION["SecurityAccess_CustomerAccess"]); 
$session_user_array = explode(';', $_SESSION["SecurityAccess_CustomerAccess"]); 
$temp = $session_user_array[3]; 
$temp = explode(':', $temp); 
$username = $temp[2]; 
echo $username; 

它只是得到了醜陋......不得不去掉引號。

if ($_SESSION["SecurityAccess_CustomerAccess"]){  
    $session_data = unserialize($_SESSION["SecurityAccess_CustomerAccess"]); 
    $session_user_array = explode(';', $_SESSION["SecurityAccess_CustomerAccess"]); 
    $temp = $session_user_array[3]; 
    $temp = explode(':', $temp); 
    $temp = str_replace("\"", "", $temp[2]); 
    $username = $temp; 
     echo $username ; 
} 

回答

9

這就是你需要:

$session_data = unserialize($_SESSION["SecurityAccess_CustomerAccess"]); 
echo $session_data['Username']; 

您的會話數據是存儲在serialized形式的數組,所以反序列化它把它放回常規PHP數組。

+0

fuc&ing brilliant!必須閱讀字符串和數組的800頁! – 2010-07-14 22:35:55

1

如果數據總是以類似的方式形成,我會建議使用正則表達式。

preg_match('/"Username";s:\d+:"(\w*)"/',$session_data,$matches); 
echo $matches[1]; 
+0

但是,如果參數並不總是按照這種順序排列,那麼您需要/"Username";s:\d+:"(.*?)"/ – 2010-07-14 22:31:30

+0

是一個行得通但錯誤的解決方案。非序列化是正確的。 – 2010-07-14 22:35:00

1

如果這些值的位置始終相同,那麼您可以編寫一些類型的正則表達式來幫助解決某些問題。但我認爲你在這裏有很好的可讀性。如果有人跟着你,他們會對你想要達到的目標有個好主意。像這樣的字符串的正則表達式可能不會有相同的效果。