【问题标题】:mysql result to multidimensional json array in different structuremysql结果到不同结构的多维json数组
【发布时间】:2019-10-15 15:56:08
【问题描述】:

我正在努力从 mysqli 结果集中获得正确的 json 数组格式。我已经广泛搜索并尝试了不同的东西。

我正在查询电子商务订单并尝试以 JSON 格式输出它们以发布到应用程序,以应用程序开发人员指定的 JSON 格式。

第一次尝试这个,分别输出每一行,不是我想要的:

while ( $row = $result->fetch_assoc())  {
    $orders[]=$row; 
} 
echo json_encode($orders, JSON_PRETTY_PRINT);

结果是

[
    {
        "WebOrderNumber_C": "938276",
        "itemName": "B3440S"
    },
    {
        "WebOrderNumber_C": "938276",
        "itemName": "D5035G"
    },
    {
        "WebOrderNumber_C": "938276",
        "itemName": "D6015"
    }
] 

第二次再次谷歌搜索并在这里阅读其他问题,我尝试了这个

while ( $row = $result->fetch_assoc())  {
$orders[$row['WebOrderNumber_C']][] = $row['itemName'];
} 
echo json_encode($orders, JSON_PRETTY_PRINT);

结果是

{
    "938276": [
        "B3440S",
        "D5035G",
        "D6015"
    ]
} 

我想要实现的格式是这样的。请帮忙

{
    "WebOrderNumber_C": "938276",
    "shipAddress": {
        "add1": "LONDON"
    },
    "items": [{
            "itemName": "B3440S"
        },
        {
            "itemName": "B3440S"
        },
        {
            "itemName": "B3440S"
        }
    ]
}

PS 如果相关,我正在使用 PHP 5.6.30。

【问题讨论】:

  • 收货地址来自哪里?
  • @barmar 很抱歉造成混乱,它是 mysqli 结果集中的另一个字段。到目前为止,我还没有开始将它包含在我的实验中,但它达到了预期的结果。如果有人原则上可以帮助我在其他元素上做错了什么,我怀疑我也可以推断它来处理送货地址。我希望:-)

标签: php mysql sql arrays json


【解决方案1】:

由于您要添加的数组是嵌套的,因此您需要在第一次遇到具有该订单号的行时创建父对象。您可以为此使用关联数组,以便轻松判断对象是否已存在。

然后添加到嵌套数组中,并使用 itemName 键将项目名称包装在关联数组中。

while ( $row = $result->fetch_assoc())  {
    $orderno = $row['WebOrderNumber_C'];
    if (!isset($orders[$orderno])) {
        $orders[$orderno] = [
            "WebOrderNumber_C" => $orderno,
            "shipAddress" => [
                "add1" => $row["add1"],
                // other fields here ...
            ],
            "items" => []
        ];
    }
    $orders[$orderno]["items"][] = ["itemName" => $row['itemName']];
}
$orders = array_values($orders); // Convert from associative array to indexed
echo json_encode($orders, JSON_PRETTY_PRINT);

【讨论】:

  • 非常感谢,只有 $orders[$orderno]]["items"][] 有一个小问题,但是检查一下我在凌晨 3.23 时是否正常注意没有什么坏处:- )
  • 这是$orders[$row['WebOrderNumber_C']] 时遗留下来的,我错过了删除] 之一。
  • 没问题。我没有抱怨这是一个很好的答案,而且也很快。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2011-06-30
相关资源
最近更新 更多