2016-07-07 43 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);' –

相关问题