【问题标题】:construct a complex JSON object from SQL result in PHP在 PHP 中从 SQL 结果构造一个复杂的 JSON 对象
【发布时间】:2014-10-18 23:55:44
【问题描述】:

我有一个包含许多表的数据库。一张表代表产品,另一张表代表类别。一种产品可以属于多个类别。因此,当我请求我的数据库显示产品及其类别时,我当然会检索每个产品具有的类别数量的行数。 例如结果是

product_name|category      |city
Test1       |cinema        |paris
Test1       |entertainment |paris
Test1       |Other         |paris
Test2       |Food          |new york
Test2       |Restaurant    |new york
Test2       |Night         |new york

我要做的是使用 PHP 脚本为每个产品名称创建一个 JSON 对象,如下所示:

    [
        {
            "product_name": "Test1",
            "categorie": [
                "cinema",
                "entertainment",
                "Other"
            ],
            "city": "paris"
        },
        {
            "product_name": "Test2",
            "categorie": [
                "Food",
                "Restaurant",
                "Night"
            ],
            "city": "new york"
        }
    ]

当我尝试使用 json_encode 但未成功时,我得到了重复的行。 感谢您的帮助

【问题讨论】:

  • 第一个按行分组。这很容易做到:使用foreach 并检查当前product_name 是否等于前一个。如果是 - 将其categorie 放入项目之一。否则 - 创建一个新条目

标签: php mysql json


【解决方案1】:

您需要在 json_encode 之前重新排序数据

如果 $rows 是你的数据库的响应,你必须去 throw

$data = [];
foreach($rows as $row) {
    $name = $row['product_name'];
    if(!isset($data[$name])) {
        $data[$name] = [
            'product_name' => $name,
            'city'=>$row['city'],
            'categories'=>[]
        ];
    }
    $data[$name]['categories'][] = $row['category'];
}
json_encode(array_values($data)); //this is what you want

就是这样! 也许您需要 while ($row=mysqli_fetch_row($result)) 而不是 foreach,具体取决于您使用的 sql 查询生成器。但是思路是一样的

【讨论】:

  • 我使用while($row = $sth->fetch(PDO::FETCH_ASSOC))。但是我在$data[$name]['categories'] = $row['category'] 线上遇到了错误
  • 是的,有一个错误。它必须有 [] 用于添加类别。我还在编码中添加了array_values,这样它就将它转换为数组而不是对象
  • 谢谢,你能解释一下最后的数据是做什么的吗?我的理解是:1-创建一个数组,2为每一行设置var名称和产品名称,并检查该值是否存在于数组中;如果不存在,则使用值创建一个新数组;如果值存在,则使用值类别创建一个新数组(现在数据有 2 个维度)。我不明白的是你如何附加类别值?
  • 如果你有一个数组变量 $var = [];您可以通过 $var[] = 'new value'; 向其附加元素例如,如果您有: $var = [];$var[] = 1;$var[] = 2;$var[] 3;此时 $var 是一个具有 [1,2,3] 值的数组。 php.net/manual/en/function.array-push.php
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2017-01-26
  • 2021-07-29
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多