【问题标题】:Create JSON in PHP在 PHP 中创建 JSON
【发布时间】:2014-10-16 20:09:30
【问题描述】:

嘿,伙计们和女孩们:)。这是我的问题。 我在数据库中有两个表(用户和 cmets)。一个用户可以发布 1 个或多个 cmets。我想以 JSON 格式从数据库中检索数据。当我检索数据时,我得到这样的格式

[{"username":"kurtMarko","message":"Kako si mama"},{"username":"kurtMarko","message":"kako si tata"},{"username":"kurtMarko","message":"kako si brate"},{"username":"kurtMarko","message":"kako si sestro"}]

但我想检索像

这样的数据
[{"username":"kurtMarko","message":[{"Kako si mama"},{"kako si tata"},{"kako si brate"},{"kako si sestro"}]]

你有什么想法,建议。每条评论都会帮助我。非常感谢。 这是我的代码

require("config.inc.php");
$query = "SELECT comments.message, users.username
            FROM comments
            LEFT JOIN users ON users.username = comments.username";

try {

    $stmt = $db->prepare($query);
    $result = $stmt->execute();

} catch(PDOException $ex){

    $response["success"] = 0;
    $response["message"] = "Database Error!";
    die(json_encode($response));

}

$rows = $stmt->fetchAll();
if ($rows) {
    $response   = array();
    foreach ($rows as $row) {
        $post["username"]= $row["username"];
        $post["message"] = $row["message"];
        array_push($response, $post);
    }
    echo json_encode($response);
} else {
    $response["success"] = 0;
    $response["message"] = "No Post Available!";
    die(json_encode($response));
}

【问题讨论】:

  • {"Kako si mama"},{"kako si tata"} 它不是一个 json,你不能通过 json_encode 创建它。只能通过直接操作字符串。
  • @Cheery 好收获。他可能意味着"Kako si mama","kako si tat" 是字符串数组的元素,而不是对象。 OP 你能确认/拒绝吗?
  • JSON 需要一个 {key:value} 对,因此 {key} 无效。我只会将您的字符串放在一个数组中,例如:["Kako si mama","kako si tata", "kako si brate", "kako si sestro"]。一个 json 库应该能够为您做到这一点。
  • ["Kako si mama","kako si tata", "kako si brate", "kako si sestro"] 的值可以是带有关键信息的 json。如果我输入$post["message"] = array() insted $post["message"] = $row["message"],然后输入foreach 循环,我得到了我想要的,但是我得到了与数据库中的用户名一样多的结果。是否有解决方案让所有消息只获得一个用户名

标签: php json phpmyadmin


【解决方案1】:

您必须为此创建不同的数组,如下所示:

$response   = array();
foreach ($rows as $row) {
    $response[$row["username"]]['message'][] = $row["message"]
}
echo json_encode($response);

也许你必须为第一个初始化

【讨论】:

  • 看起来不错,但是如果我想要 JSONArray 我将拥有该消息的每个消息键怎么办?现在它打印"message":"message":["Kako si mama","kako si tata","kako si brate","kako si sestro"]。您将更改代码以打印"messages:[{"message":"Kako si mama"},{"message":"kako si tata"},{"message":"kako si brate"},{"message":"kako si sestro"}]。你有什么想法吗?
  • 如您在此处看到的:ideone.com/fork/Mx3qGq,它的工作,也许您的 $rows 数组中有不同的东西,使用 print_r() 来检查!
【解决方案2】:

您想要的数据库结构使这变得困难。由于用户名不是数组中的键,因此您必须重复搜索整个数组以查找特定用户名的位置,以便您可以在该用户下附加新消息。为什么不改用这个:

$arr = array();
foreach($rows as $row) {
    $user = $row['username'];
    $msg = $row['message'];
    $arr[$user][] = $msg;
}

这会给你:

Array (
    'Fred' => array('msg1', 'msg2', 'msg3');
    'Susie' => array('msg4', 'msg5', ....)
);

【讨论】:

  • 返回空值。类似于 []。
【解决方案3】:

说实话,你不喜欢的第一个版本实际上更好。

您想按对象对记录进行分组。

如果这些值重复,这不是问题,也没有什么坏处。

通过删除冗余值来缩短您的 JSON 字符串可能很诱人,但这会使操作您的对象变得更加困难。

这是 json 的全部意义(JavaScript Object Notation),在您的示例中,每个注释都代表一个对象,这是一个完美的对象图,不要修改它。

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 2021-04-27
    • 2017-05-23
    • 2015-07-03
    • 2022-12-04
    • 2020-12-05
    • 2018-05-08
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多