Как сгладить массив для вывода json php

#php #arrays #json #nested #flatten

#php #массивы #json #вложенный #сгладить

Вопрос:

Я в значительной степени самостоятельно обучаю себя программированию и немного поиграл с созданием приложения scraper. У меня есть массив, который я использую в 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=lVVK6amp;pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6damp;pd_rd_w=gWC2Famp;ref_=pd_gw_riamp;pf_rd_r=W68MX1TXFDDJ8Q8Z08CPamp;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-e8cc09a11f88amp;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=lVVK6amp;pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6damp;pd_rd_w=gWC2Famp;ref_=pd_gw_riamp;pf_rd_r=W68MX1TXFDDJ8Q8Z08CPamp;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-e8cc09a11f88amp;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);
  

Любая помощь приветствуется!!

Комментарии:

1. $yourArray['result'] = array_values($yourArray['result']) ?

2. Создает ошибку @Dharman извините

3. Какая ошибка? Что вы пробовали? Я не вижу ваш экран, помните?

4. Я использую postman для использования API, и он выдает эту ошибку, которая по какой-то причине фактически связана с кодом ответа http, но это происходит только тогда, когда я добавляю приведенную выше строку. Это ошибка… <br /> <b> Ошибка синтаксического анализа </b>: синтаксическая ошибка, неожиданный ‘http_response_code’ (T_STRING) в <b>C:xampphtdocsapiproductread-merged.php </b> на линии <b>79</b> <br />

5. Вы забыли ; после предыдущей строки…

Ответ №1:

Вот так:

 $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=lVVK6amp;pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6damp;pd_rd_w=gWC2Famp;ref_=pd_gw_riamp;pf_rd_r=W68MX1TXFDDJ8Q8Z08CPamp;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-e8cc09a11f88amp;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 первый уровень ключа результата представляет собой массив с одним индексированным элементом, который после декодирования в многомерный массив присваивает индекс 0. Чтобы превратить все ключи, содержащиеся на этом уровне, в индексы, вам нужно только использовать функцию array_values PHP.

Комментарии:

1. Извините, это в значительной степени то, что @dharman предложил выше, но это вообще не изменило результат

2. @Chris: нет, это не то, что Дхарман предложил выше. Внимательно прочитайте и посмотрите демонстрацию: 3v4l.org/CCgYF

3. @Chris: если вы не примете мой ответ, я начну войну против всех крисов мира.

4. Да, ваше право, это действительно работает! Проблема в том, что я изо всех сил пытаюсь использовать его для решения своей проблемы. Данные, с которыми я работаю, не преобразуются в формат json до конца документа, они находятся в массиве. Я пытался заменить $arr на фактическое имя массива. Подождите, я опубликую код, который я использую для форматирования данных.

5. @Chris: Если вам нужно углубиться в свои объяснения, пожалуйста, отредактируйте свой вопрос.

Ответ №2:

Это должно сработать

 $json = '{
    "result": [
        {
            "Boot buddy": {
                "id": "2",
                "groupno": "1",
                "urlsource": "https://www.amazon.co.uk/Boot-Buddy-fastest-simplest-footwear/dp/B014UPAHO4?pd_rd_wg=lVVK6amp;pd_rd_r=bf1ba871-fb59-4c66-a146-e94dde7c8e6damp;pd_rd_w=gWC2Famp;ref_=pd_gw_riamp;pf_rd_r=W68MX1TXFDDJ8Q8Z08CPamp;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-e8cc09a11f88amp;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);