【问题标题】:How to flatten array for json output php如何为json输出php展平数组
【发布时间】:2019-09-11 03:57:12
【问题描述】:

我几乎是在自学编写代码,并在创建一个抓取应用程序方面玩了一点儿游戏。我有一个我在 json api 中使用的数组,但我需要展平结构,以便我可以轻松地在其他地方使用它。

我真的很难弄清楚我需要在这里做什么。我已经阅读了大量其他类似请求的问题,但数组格式与我的格式不匹配,所以我实际上不知道如何解决这个问题。

这是当前的数组结构

{
    "result": [
        {
            "Boot buddy": {
                "id": "2",
                "groupno": "1",
                "urlsource": "https://www.amazon.co.uk/Boot-Buddy-fastest-simplest-footwear/dp/B014UPAHO4?pd_rd_wg=lVVK6&pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6d&pd_rd_w=gWC2F&ref_=pd_gw_ri&pf_rd_r=W68MX1TXFDDJ8Q8Z08CP&pf_rd_p=cecd4520-32f6-5499-ae19-cd4e83816acd",
                "name": "Boot buddy",
                "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
                "price": "£14.99,£14.99,£14.99"
            },
            "Amazon echo": {
                "id": "1",
                "groupno": "1",
                "urlsource": "https://www.amazon.co.uk/dp/B07CH6JKW3/ref=gw_uk_desk_h1_aucc_cp_mp?pf_rd_p=e4e5a2e6-ddbd-473a-a5fb-e8cc09a11f88&pf_rd_r=1MN25BRXY8YDQ4TBK4X6",
                "name": "Amazon echo",
                "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
                "price": "£14.99,£14.99,£14.99"
            }
        }
    ]
}

我想实现这个

{
    "result": [
        {
            "id": "2",
            "groupno": "1",
            "urlsource": "https://www.amazon.co.uk/Boot-Buddy-fastest-simplest-footwear/dp/B014UPAHO4?pd_rd_wg=lVVK6&pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6d&pd_rd_w=gWC2F&ref_=pd_gw_ri&pf_rd_r=W68MX1TXFDDJ8Q8Z08CP&pf_rd_p=cecd4520-32f6-5499-ae19-cd4e83816acd",
            "name": "Boot buddy",
            "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
            "price": "£14.99,£14.99,£14.99"
        },
        {
            "id": "1",
            "groupno": "1",
            "urlsource": "https://www.amazon.co.uk/dp/B07CH6JKW3/ref=gw_uk_desk_h1_aucc_cp_mp?pf_rd_p=e4e5a2e6-ddbd-473a-a5fb-e8cc09a11f88&pf_rd_r=1MN25BRXY8YDQ4TBK4X6",
            "name": "Amazon echo",
            "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
            "price": "£14.99,£14.99,£14.99"
        }
    ]
}

这是我用来生成数组的代码,然后将其转换为 json 以在 api 中使用。我正在迭代先前对数据库的调用以将重复记录合并在一起,但保留唯一的日期和价格数据。所以也许有办法改变这段代码以获得我想要的输出?

    $records=array();
    $records[result]=array();
    foreach ($products_arr[records] as $key => $value) {
        $hash = $value['name'];
        if(isset($result[$hash])){
            $result[$hash]['date'] .= ",{$value['date']}";
            $result[$hash]['price'] .= ",{$value['price']}";

        }else{
            $result[$hash] = $value;
        }
    }
    array_push($records[result], $result);

任何帮助表示赞赏!

【问题讨论】:

  • $yourArray['result'] = array_values($yourArray['result'])?
  • 创建错误@Dharman 抱歉
  • 什么错误?你尝试了什么?我看不到你的屏幕,记得吗?
  • 我正在使用邮递员来使用 api,并且由于某种原因它实际上与 http 响应代码有关,但它只发生在我添加上面的行时。这是错误...
    解析错误:语法错误,C:\xampp\htdocs\api\product\read-merged 中出现意外的“http_response_code”(T_STRING)。 php 上线 79
  • 你在上一行之后忘记了;...

标签: php arrays json nested flatten


【解决方案1】:

这应该可以工作

$json = '{
    "result": [
        {
            "Boot buddy": {
                "id": "2",
                "groupno": "1",
                "urlsource": "https://www.amazon.co.uk/Boot-Buddy-fastest-simplest-footwear/dp/B014UPAHO4?pd_rd_wg=lVVK6&pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6d&pd_rd_w=gWC2F&ref_=pd_gw_ri&pf_rd_r=W68MX1TXFDDJ8Q8Z08CP&pf_rd_p=cecd4520-32f6-5499-ae19-cd4e83816acd",
                "name": "Boot buddy",
                "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
                "price": "£14.99,£14.99,£14.99"
            },
            "Amazon echo": {
                "id": "1",
                "groupno": "1",
                "urlsource": "https://www.amazon.co.uk/dp/B07CH6JKW3/ref=gw_uk_desk_h1_aucc_cp_mp?pf_rd_p=e4e5a2e6-ddbd-473a-a5fb-e8cc09a11f88&pf_rd_r=1MN25BRXY8YDQ4TBK4X6",
                "name": "Amazon echo",
                "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
                "price": "£14.99,£14.99,£14.99"
            }
        }
    ]
}';

$arr = (array) json_decode($json)->result[0];
foreach($arr as $data){
  $newArr['result'][] = $data;
}
echo json_encode($newArr);

【讨论】:

    【解决方案2】:

    这样:

    $json=<<<'EOD'
    {
        "result": [
            {
                "Boot buddy": {
                    "id": "2",
                    "groupno": "1",
                    "urlsource": "https://www.amazon.co.uk/Boot-Buddy-fastest-simplest-footwear/dp/B014UPAHO4?pd_rd_wg=lVVK6&pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6d&pd_rd_w=gWC2F&ref_=pd_gw_ri&pf_rd_r=W68MX1TXFDDJ8Q8Z08CP&pf_rd_p=cecd4520-32f6-5499-ae19-cd4e83816acd",
                    "name": "Boot buddy",
                    "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
                    "price": "£14.99,£14.99,£14.99"
                },
                "Amazon echo": {
                    "id": "1",
                    "groupno": "1",
                    "urlsource": "https://www.amazon.co.uk/dp/B07CH6JKW3/ref=gw_uk_desk_h1_aucc_cp_mp?pf_rd_p=e4e5a2e6-ddbd-473a-a5fb-e8cc09a11f88&pf_rd_r=1MN25BRXY8YDQ4TBK4X6",
                    "name": "Amazon echo",
                    "date": "2019-04-14 16:00:29.595,2019-04-14 21:50:31.362,2019-04-14 21:54:11.184",
                    "price": "£14.99,£14.99,£14.99"
                }
            }
        ]
    }
    EOD;
    
    $arr = json_decode($json, true);
    $arr['result'] = array_values($arr['result'][0]);
    $result = json_encode($arr);
    

    在原始 JSON 字符串中,result 键的第一级是一个带有单个索引项的数组,一旦解码为多维数组,该索引项就会给出索引 0。索引级别,只需要使用array_values PHP函数即可。

    【讨论】:

    • 抱歉,这与@dharman 上面的建议差不多,但它根本没有改变输出
    • @Chris:不,这不是 dharman 上面建议的。仔细阅读并查看演示:3v4l.org/CCgYF
    • @Chris:如果你不接受我的回答,我将与全世界所有的 Chris 开战。
    • 是的,您的权利确实有效!问题是我正在努力使用它来解决我的问题。我正在使用的数据在文档结束之前不会转换为 json 格式,它在一个数组中。我试图将 $arr 换成数组的实际名称。等一下,我会发布我用来格式化数据的代码。
    • @Chris:如果您需要更深入地解释,请编辑您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多