如何生成包含文本数组的有效json输出

时间:2018-03-14 13:40:48

标签: php mysql json

我在本地服务器上用phpMyAdmin创建了一个mySQL数据库。在这个数据库中,我存储了我的朋友的名字和最喜欢的NBA球队(以及id作为数据库的主键)。但是,我的一些朋友可能有两个最喜欢的球队。我编写并运行以下php脚本从数据库中的一个表中检索这些数据(我知道这不是让一个表用于多对多关系的最佳方式)并将它们投影到我的本地Web服务器(XAMPP)上:

$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);

header('Content-Type: application/json');

$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);

arr = [];

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        $arr[] = $row;

    }
}

echo json_encode($arr, JSON_PRETTY_PRINT);

但是,通过这种方式,我将此输出作为一个人使用:

   [{
        "id": "1",
        "name": "David Belton",
        "team": "Boston Celtics"
    }, {
        "id": "1",
        "name": "David Belton",
        "team": "Cleveland Cavaliers"
    }]

但是,我希望得到这样的东西作为每个特定人的输出:

{
    "id": "1",
    "name": "David Belton",
    "team": ["Boston Celtics", "Cleveland Cavaliers"] 
}

这可以在PHP中使用吗?

如果是这样,是建议还是应该在数据库中使用MySQL?

3 个答案:

答案 0 :(得分:0)

您必须更改while循环,以根据ID列添加到最终数组中的唯一数据:

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        if (!isset($arr[$row['id']])) {
            $arr[$row['id']] = $row;
            $arr[$row['id']]['location'] = [$row['location']];
        } else {
            $arr[$row['id']]['location'][] = $row['location'];
        }
    }
}

echo json_encode(array_values($arr), JSON_PRETTY_PRINT);

但你应该考虑@ceejayoz所评论的内容。

答案 1 :(得分:0)

试试这个:

$sql = 'SELECT id, name, GROUP_CONCAT(team) as team FROM friends GROUP BY id;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);

arr = [];

if ($resultCheck > 0) {
    $key = 0;
    while ($row = mysqli_fetch_assoc($result)) {
        $arr[$key] = $row;
        $arr[$key]['team'] = explode(",", $row['team']);
        $key++;
    }
}

echo json_encode($arr, JSON_PRETTY_PRINT);

答案 2 :(得分:0)

这样做的典型方法是拥有users表和user_favorites表。将用户特定的项目存储在users中,user_favorites类似于user_id: 1, team: Boston Celtics

或者(并且最少练习-y),您可以将多个收藏夹存储在单个users记录中。根据您的数据,您将JSON编码的字符串存储到(Boston Celtics,Cleveland Cavaliers)中的CSV表示(TEXT)或["Boston Celtics", "Cleveland Cavaliers"]字段可以正常工作。

这种方法的缺点是MySQL数据库不易索引,因此当你有很多用户时,SELECT * FROM users WHERE favorite LIKE '%Boston Celtics%'不会非常快。