2014-10-18 104 views
0

我有一个数据库与许多表。一个表格代表产品,另一个表格代表类别。一个产品可以属于多个类别。所以,当我要求我的数据库显示产品的类别时,我当然会检索许多行,每种产品都有很多类别。 举例来说结果将是从PHP结果构建一个复杂的JSON对象PHP

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但不成功我得到重复的行。 感谢您的帮助

+0

第一组按行。这很容易:使用'foreach'并检查当前的'product_name'是否与前一个相同。如果是 - 将其“分类”放到项目中。否则 - 创建一个新条目 – zerkms 2014-10-18 23:59:27

回答

2

您将需要json_encode

如果$行之前重新安排你的数据是你的数据库的响应,你必须去扔

$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查询生成器。但想法是一样的

+0

我使用'while($ row = $ sth-> fetch(PDO :: FETCH_ASSOC))''。然而,我在$ data [$ name] ['categories'] = $ row ['category']' – 2014-10-19 00:24:48

+0

这行上得到了一个错误。是的,有一个错误。它必须具有用于添加类别的[]。我还将array_values添加到了编码中,这样它就以数组的形式转换,而不是作为对象 – ngleich 2014-10-19 00:39:05

+0

谢谢,请您解释一下最后一个数据的作用?我的理解是:1-您创建一个数组,每行2个,您将var名称与产品名称一起设置,并检查数组中是否存在此值;如果不存在,则使用值创建一个新数组;如果值存在,则使用值类别创建一个新数组(现在数据有2个维度)。我不明白的是你如何附加类别值? – 2014-10-19 00:52:09