【问题标题】:How to group database table data by two columns and output as json?如何将数据库表数据按两列分组并输出为json?
【发布时间】:2018-11-10 07:29:47
【问题描述】:

我正在尝试从 PhpMyAdmin(Mysql) 获取 JSON(PHP)。它实际上需要看起来像:

[{ “converterno”: ”1”, “zoneno”: {“1a”, “codeid”:[“t1”,”t2”,”t3”]}, “zoneno”: {“1b”, “codeid”:[“t21”,”t0”,”t13”]}},{ “converterno”: ”2”, “zoneno”: {“2a”, “codeid”:[“t023”,”t9”,”t31”]}},………………………..  

但我实际上得到的是

[{"converternumber":"1","zonenumber":{"0":"","codeid":["er"]}},{"converternumber":"1","zonenumber":{"0":"wr","codeid":["fxv"]}},{"converternumber":"2","zonenumber":{"0":"b2","codeid":["gffff"]}}]

我不知道为什么我一开始就得到零分

PHP代码是:

<?php
$db_name="app1";
$mysql_user="root";
$server_name="localhost";

$connectionn=mysqli_connect($server_name,$mysql_user,"",$db_name);
$n_converternumber= ["converternumber"];
$n_zonenumber= ["zonenumber"];
$n_codeid= ["codeid"];

$sql_query = "select * from addcode";
$result= mysqli_query($connectionn,$sql_query);

while ($row = mysqli_fetch_array($result)){
  if(!isset($info[$row['converternumber']])){
    $info[$row['converternumber']] = array(
      'converternumber'=> $row['converternumber'],
      'zonenumber' => array($row['zonenumber'],
      'codeid' => array($row['codeid']))
    );
}}
echo json_encode($info);
?>

谁能告诉我在“While”循环中哪里出错了。

浏览了 StackOverFlow 中与 JSON 相关的所有代码,但没有找到更接近或相似的内容。几乎尝试了所有内容并立即发布! 希望我能在这里得到任何帮助!

数据库中的表是: Table addcode

【问题讨论】:

  • 我认为 - 与@MadhurBhaiya(对不起)相反 - 你根本不想要 zonenumber 的数组:...'zonenumber' =&gt; $row['zonenumber'], 'codeid' =&gt; $row['codeid']..
  • @MadhurBhaiya 和 @mickmackusa ,这不是一个错字或双重要清楚,我在 array( $row['zonenumber']........array($row['codeid]) ) 打开数组并在此处关闭。我想做这样的事情。 link。所以请重新检查这个问题,也许我不需要区域的数组,但我没有得到想要的结果,我不时地通过放置数组并删除它们来进行试错。希望你能帮助我。请参考@Nigel Ren 解决方案。虽然它不起作用,但我认为他/她很好地理解了这个问题。
  • 您对 zone 成为您想要的结果中的字符串值感到高兴吗?如果是这样,请更新您的问题。
  • 是的@mickmackusa。区域是“varchar”。在尝试了许多方法后,我也无法得到想要的结果。我将更新我很快尝试过的另一个代码。
  • @mickmackusa 我是重新开放的缺票之一......现在完成。

标签: php mysql arrays json


【解决方案1】:

经过长时间的讨论,您似乎想要一个“祖父母-孩子”结构。这非常容易形成,并且完全关联的结构将使您的数据非常紧凑且易于迭代。

*您应该使用mysqli_fetch_assoc() 而不是膨胀的mysqli_fetch_array(),因为您不打算使用它生成的索引元素。

代码 (Demo based on your database screenshot)

while ($row = mysqli_fetch_assoc($result)){
    $info[$row['converternumber']][$row['zonenumber']][] = $row['codeid'];
}

3 级数组如下所示:

array (
  1 => 
  array (
    '1a' => 
    array (
      0 => 'test007',
      1 => 'test006',
      2 => 'test0094',
      3 => 'test0098',
      4 => 'test010',
      5 => 'test111',
      6 => 'test 008',
      7 => 'test112',
      8 => 'test004',
      9 => 'test002',
      10 => 'test001',
    ),
    23 => 
    array (
      0 => 'rg',
    ),
    '2a' => 
    array (
      0 => 'test001',
      1 => 'test003',
    ),
    'feh' => 
    array (
      0 => 'ndo',
    ),
    'wr' => 
    array (
      0 => 'fxv',
    ),
  ),
  2 => 
  array (
    '1a' => 
    array (
      0 => 'test',
    ),
    'b2' => 
    array (
      0 => 'gffff',
    ),
  ),
)

【讨论】:

  • @Arvind 你知道怎么进入聊天室吗?还是你受够了希望我离开?
  • @Arvind 我已经更新了......再次。事实上,我大部分都将我的答案恢复到以前的版本,我建议使用复合临时键来帮助有效分组。我还写了你在我们讨论中提到的空初始数据。
  • @mickmackusa,我之前已经得到了这个,但我不希望转换器编号像那样重复。准确的说,我要赞[{ “converterno”: ”1”, “zoneno”: {“1a”, “codeid”:[“t1”,”t2”,”t3”]}, “zoneno”: {“1b”, “codeid”:[“t21”,”t0”,”t13”]}},{ “converterno”: ”2”, “zoneno”: {“2a”, “codeid”:[“t023”,”t9”,”t31”]}},……………………….. 希望能得到结果
  • 您现在所要求的实际上是不可能的。您永远不会有一个数组在同一级别中有两个 zoneno 键。当你有一个有效的数组结构时让我知道。我觉得我现在在重复自己,但这就是为什么我敦促您使用嵌套和完全关联的数组结构。
  • {"1":{"wr":["fxv"],"feh":["ndo"],"23":["rg"],"2a":["test","test001"],"1a":["test 008","test006","test007","test008","test009","test0094","test0098","test010","test111","test112"],"a1":["test001","test002","test003","test004"],"12":["yx"]},"2":{"b2":["gffff"],"1a":["test"]},"19":{"sb":["sb"]}}这次让我非常非常清楚,上面的JSON就是你给我的。我只想将它们标记为“1”作为转换器,将“wr、feh、23 等”标记为区域,将“fxv、ndo、rg 等”标记为代码。希望你现在明白了。 @mickmackusa
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多