【问题标题】:Convert mysql select results to json (array of arrays)将mysql选择结果转换为json(数组数组)
【发布时间】:2015-02-09 00:31:28
【问题描述】:

我需要将表格内容编码为 JSON 以便将其插入文件中。

输出必须如下:

{
"name1":[{"id":"11","name":"name1","k1":"foo","k2":"bar"}],
"name2":[{"id":"12","name":"name2","k1":"foo","k2":"bar"}],
}

确实,每个 JSON“行”对应 mysql 行的内容,每个 JSON 数组的名称是“名称”列的名称。

目前我唯一能做到的是:

      $return_arr = array();
$sql = "SELECT * FROM bo_appart"; 
$result = mysql_query($sql) or die(mysql_error());

$index = 0;
while ($row = mysql_fetch_assoc($result)) {
$return_arr[$index] = $row;
 $index++;
}

echo json_encode($return_arr);

这是我得到的输出:

[
{"id":"11","name":"name1","k1":"foo","k2":"bar"},
{"id":"12","name":"name2","k1":"foo","k2":"bar"},
]

非常感谢!!!

更新

工作代码:

$return_arr = array();
$sql = "SELECT * FROM bo_appart"; 
$result = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_assoc($result)) {
$return_arr[ $row['nom_appart'] ][] = $row;
}

echo json_encode($return_arr);

}

【问题讨论】:

  • 太棒了。你有问题吗?
  • 那么您的实际问题是什么?只需构建您想要的数据结构,然后 json_encode() 即可。
  • 我刚刚进行了编辑,以便您可以看到我实际做了什么。问题是我没有设法建立正确的结构:/
  • $return_arr[ $row['name'] ][] = $row; ...

标签: php mysql arrays json multidimensional-array


【解决方案1】:

你很亲密。我注意到您希望最终输出是一个对象而不是数组,因为外括号是 {} 而不是 []。所以你需要一个不同的对象类型,并且你需要使用每一行的名字作为存储那一行的键。

$return_obj = new stdClass();
$sql = "SELECT * FROM bo_appart"; 
$result = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_assoc($result)) {
    $name = $row['name'];
    $return_obj->$name = [$row]; // for PHP < 5.4 use array($row)
}

echo json_encode($return_obj);

【讨论】:

  • 顺便说一句,json_encode() 会自动将关联数组转换为对象。在您的新版本中,最后一行将覆盖所有其他行(如果有多个同名),但如果 OP 知道/关心这一点,则 idk
  • 啊是的,也可以在非关联数组上使用 JSON_FORCE_OBJECT (PHP > 5.3)。我想我只是不够信任它;),但这是记录在案的行为。
  • @RobP 几乎!!!这是我得到的: {"name1":{"id":"11","name":"name1","k1":"foo","k2":"bar"}, "name2":{ "id":"12","name":"name2","k1":"foo","k2":"bar"},} 它们需要在数组中,我们对它关闭
  • @RentYourParis 我编辑了我的答案,在 $row 周围添加括号,while 循环的最后一行
  • @meda 我使用的是对象,而不是关联数组。在while循环的最后一行,以name为key为对象添加一个属性,一个包含行作为对应值的数组。我认为学习在 PHP 中处理对象的语法是很有价值的,所以这是一个很好的练习。
【解决方案2】:

这个循环就足够了,可以创建所需的 JSON:

$return_arr = array();
while ($row = mysql_fetch_assoc($result)) {
    $return_arr[$row['name']][] = $row; #or $return_arr[$row['name']] = [$row];
}
echo json_encode($return_arr);

【讨论】:

  • 我知道 array() 适用于所有版本的 PHP,但我真的很喜欢较新版本支持的 [] 表示法。旧习惯很难改掉:)
  • 我不知道为什么我仍然坚持使用array() 你是对的[] 更干净,array() 看起来像一个函数,是 PHP 怪异的一个 lol
  • 为什么$return_arr[$row['name']][] = array($row); 中有多余的括号?为什么不$return_arr[$row['name']] = array($row);
  • @RobP 是强制数组括号,老实说我没有测试,但$return_arr[$row['name']][] = $row; 感谢指出
  • 这是多余的,我在 eval.io 上测试过。您可以在左侧添加 [] 或在右侧强制使用数组,但不能同时添加。我看到你编辑修复!我个人觉得将右侧设为数组更具可读性,但无论如何。
【解决方案3】:
<?php

$sql = "SELECT * FROM bo_appart"; 
$result = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_array($result)) {
$return_arr[] = $row;
}

echo json_encode($return_arr);

?>

【讨论】:

  • OP = 原始海报(在 StackOverflow 上:提问的人)
  • 我说的是基本上,意思是他们做同样的事情。 OP 使用 $index = 0, 1, ... 而你将其省略 - 导致完全相同的数组
【解决方案4】:

我花了很多时间来创建 mash/mysql-json-serializer 包。

https://github.com/AndreyMashukov/mysql-json-serializer

您可以选择json_objects等Json_array。它支持ManyToMany,oneToMany,manyToOne关系

SELECT JSON_ARRAYAGG(JSON_OBJECT('id',est_res.est_id,'name',est_res.est_name,'advert_groups',(SELECT JSON_ARRAYAGG(JSON_OBJECT('id',adg.adg_id,'name',adg.adg_name)) FROM advert_group adg INNER JOIN estate est_2 ON est_2.est_id = adg.adg_estate WHERE est_2.est_id = est_res.est_id))) FROM (SELECT * FROM estate est LIMIT 1 OFFSET 2) est_res

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2017-06-05
    • 2015-02-06
    • 2015-02-14
    • 2019-05-22
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多