【问题标题】:PHP JSON array from query来自查询的 PHP JSON 数组
【发布时间】:2014-04-18 21:27:05
【问题描述】:

我不是 php 开发人员,但试图从这个查询中获取数组中的数组:

SELECT distinct d.DiscussionId 作为 DiscussionId,d.AvatarId 作为 AvatarId,d.Heading 作为 Heading,d.body 作为 Body,c.commentid 作为 CommentId,c.userid 作为 UserId,c.comment 作为 Comment 来自讨论作为 d INNER JOIN 评论 AS c ON d.discussionid = c.discussionid WHERE d.DiscussionId = c.DiscussionId

JSON 输出为:

[
    {
        "DiscussionId": "1", 
        "AvatarId": null, 
        "Heading": "New discussion heading", 
        "Body": "This is the discussion body", 
        "Comments": [
            {
                "DiscussionId": "1", 
                "CommentId": "1", 
                "UserId": "2", 
                "Comment": "This is a comment i made"
            }
        ]
    }, 
    {
        "DiscussionId": "1", 
        "AvatarId": null, 
        "Heading": "New discussion heading", 
        "Body": "This is the discussion body", 
        "Comments": [
            {
                "DiscussionId": "1", 
                "CommentId": "2", 
                "UserId": "2", 
                "Comment": "This is a second comment"
            }
        ]
    }
]

我需要将所有评论嵌套在一个讨论中。

php 代码在下面,没有错误但没有给出我想要的输出,对于每个讨论可能有几个 cmets 所以我需要 DiscussionId:1 只显示一次,带有多个 cmets 数组

$result = mysql_query($query,$link) or die('Errant query:  '.$query);



 $model = array();
 $record = -1;
 $currentWeID = -1;    
 while($e = mysql_fetch_assoc($result)){ 
 $record++;
 $model[] = array();
 $model[$record]['DiscussionId'] = $e['DiscussionId']; 
 $model[$record]['AvatarId'] = $e['AvatarId']; 
 $model[$record]['Heading'] = $e['Heading'];
 $model[$record]['Body'] = $e['Body']; 
 $model[$record]['Comments'][] = array( 

 'DiscussionId'=> $e['DiscussionId'], 
 'CommentId' => $e['CommentId'], 
 'UserId' => $e['UserId'], 
 'Comment' => $e['Comment'] 
 ); 

}


print json_encode ($model); 

【问题讨论】:

  • 发布您尝试过的代码以及它导致的错误。

标签: php sql arrays json


【解决方案1】:

您正在从单个dicussion 中选择多个comments。 您应该覆盖该变量,而不是在每次迭代时创建一个新元素:

 $model = array();  
 while($e = mysql_fetch_assoc($result)){ 
 //We overwrite the same variable, that's ok
 $model['DiscussionId'] = $e['DiscussionId']; 
 $model['AvatarId'] = $e['AvatarId']; 
 $model['Heading'] = $e['Heading'];
 $model['Body'] = $e['Body']; 
 //Only comments would be an array
 $model['Comments'][] = array( 
        'DiscussionId'=> $e['DiscussionId'], 
        'CommentId' => $e['CommentId'], 
        'UserId' => $e['UserId'], 
        'Comment' => $e['Comment'] 
        ); 
}

【讨论】:

    【解决方案2】:

    试试这样:

    添加了讨论 ID 作为数组的索引,应该适合你。只是在我的脑海中,未经测试。

    $result = mysql_query($query,$link) or die('Errant query:  '.$query);
    $model = array();
     $record = -1;
     $currentWeID = -1;
     $model = array(); 
    
     while($e = mysql_fetch_assoc($result)){ 
     $record++;
     $model[$e['DiscussionId']][$record]['AvatarId'] = $e['AvatarId']; 
     $model[$e['DiscussionId']][$record]['Heading'] = $e['Heading'];
     $model[$e['DiscussionId']][$record]['Body'] = $e['Body']; 
     $model[$e['DiscussionId']][$record]['Comments'][] = array( 
    
     'DiscussionId'=> $e['DiscussionId'], 
     'CommentId' => $e['CommentId'], 
     'UserId' => $e['UserId'], 
     'Comment' => $e['Comment'] 
     ); 
    
    }
    
    
    print json_encode ($model); 
    

    【讨论】:

    • 感谢您的快速回复,它看起来更近了,但只返回第二条评论以供讨论
    • @user3550256 现在试试,我把$model = array(); 错误地留在了while循环中
    【解决方案3】:

    试试这个:

    $result = mysql_query($query,$link) or die('错误查询:'.$query);

     $model = array();
     $record = 0;
     $currentWeID = -1;    
     while($e = mysql_fetch_assoc($result)){ 
     $model[] = array();
     $model[$record][$e['DiscussionId']]['AvatarId'] = $e['AvatarId']; 
     $model[$record][$e['DiscussionId']]['Heading'] = $e['Heading'];
     $model[$record][$e['DiscussionId']]['Body'] = $e['Body']; 
     $model[$record][$e['DiscussionId']]['Comments'][] = array( 
        'DiscussionId'=> $e['DiscussionId'], 
        'CommentId' => $e['CommentId'], 
        'UserId' => $e['UserId'], 
        'Comment' => $e['Comment'] 
        ); ;
     $record++;
    }
    
    
    print json_encode ($model); 
    

    这可能会对您有所帮助。如果有帮助不要忘记接受答案。

    【讨论】:

      【解决方案4】:

      仅更改 SQL 查询是不可能的:您需要更改将查询结果转换为 JSON 的服务器端代码(据我所知是 PHP)。

      【讨论】:

      • 这是评论而非答案。
      猜你喜欢
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多