2016-07-07 202 views
0

我在MySQL數據庫中有一個JSON字符串,我可以從WordPress中獲取2個數字。從JSON數組中獲取最後一個值

我的字符串如下:

a:1:{i:300;a:4:{s:7:"lessons";a:1:{i:302;i:1;}s:6:"topics";a:1:{i:302;a:2:{i:304;i:1;i:311;i:1;}}s:9:"completed";i:1;s:5:"total";i:4;}} 

i:300是過程ID。在topics內是302311。這些是完成的每個頁面的ID。我需要獲得最後一個,在這種情況下將是311

基本上,我需要的東西,將做到以下幾點:

獲取頁面ID 查找頁面ID JSON字符串 獲取從JSON字符串主題的最後一個ID

我會如何呢?

更新 - 從數據庫獲取字符串但不顯示。

$conn = new mysqli($servername, $username, $password, $dbname); 
$user_id = get_current_user_id(); 
$sql1 = "SELECT meta_value FROM xrji_usermeta"; 
$sql3 = " WHERE user_id = ".$user_id." AND meta_key = '_sfwd-course_progress';"; 
$sql = $sql1 . "" . $sql3; 
//echo "sql: ".$sql; 
$a = $conn->query($sql); 
$results = unserialize($a); 
echo "<br>results: ".$results; 

我有上述然而什麼都不顯示了$results但是如果我運行查詢通過續集親它工作正常。

SELECT meta_value FROM xrji_usermeta WHERE user_id = 2 AND meta_key = '_sfwd-course_progress' 
+0

print_r(unserialize($ str)); – splash58

+1

此JSON無效 – mulquin

+1

此字符串是序列化數組。首先你需要['unserialize()'](http://php.net/manual/en/function.unserialize.php)它;將其作爲普通數組訪問它; [演示](https://eval.in/601791)。 –

回答

3

你貼什麼是不是一個JSON,它是PHP序列是通過serialize()函數來完成的結果。

爲了使用這些值,你必須得到這個字符串,並傳遞給unserialize()功能,它會給你...好,它會給你一個錯誤:

PHP的通知:反序列化( ):在235字節的偏移5處出錯

這是因爲您認爲它是JSON併爲我們格式化它。對於序列化的字符串,JSON和死亡沒關係。你需要擺脫空格:

'a:1:{i:300; a:4:{s:7:「lessons」; a:1:{i:302; i:1;} s :6: 「主題」;一個:1:{I:302;一個:2:{I:304; I:1; I:311; I:1;}} S:9: 「完成」; I:1 ; S:5: 「總」; I:4;}}」

你做就可以了unserialize()後,您將獲得:

Array 
(
    [300] => Array 
     (
      [lessons] => Array 
       (
        [302] => 1 
       ) 

      [topics] => Array 
       (
        [302] => Array 
         (
          [304] => 1 
          [311] => 1 
         ) 

       ) 

      [completed] => 1 
      [total] => 4 
     ) 
) 

所以,你在$一個PHP數組和現在你可以隨心所欲地做任何事情:

$courseID = 300; 
$lessons = array_keys($a[$courseID]['lessons']); 
$topics = array_keys($a[$courseID]['topics']); 
$pages = array_keys($a[$courseID]['topics'][ $topics[0] ]); 
$lastPage = $pages[ count($pages)-1 ]; 

你會在$主題中有302,在$ pages中有304和311,在$ lastPage中有311。

旁註:如何從PHP序列

區分JSON這是一個有點簡單化,但它是很好的記憶。每當我看到一堆<one-letter>:<number>:<value>週期,我認爲它是串行化的結果,其中<one-letter>是類型(一個 rray,小號特林, nteger)和<number>在字符或陣列元件的長度(省略整數)。如果不是<one-letter>,我會看到包含在"quotation_marks"中的描述性變量名稱或包裝在[square brackets]中的數組,我假定它是JSON。

+0

我不允許在你的問題的評論中長時間討論,但請嘗試我在這裏描述的代碼,它似乎已經解決了你的問題。 –

+0

我有一個查詢來從數據庫中獲取字符串,如果我在續集pro中運行查詢它工作正常,但是當通過PHP運行時我得到零輸出。我用代碼更新了我的問題。你介意看一下嗎?謝謝 –

+0

@BenH,在$ conn-> query()行之後,添加'$ result = $ a-> fetch_array(MYSQLI_ASSOC);'然後'var_dump($ result);' –

相關問題