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

Я в значительной степени сам учусь программировать и немного играю с созданием приложения для очистки. У меня есть массив, который я использую в 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);

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


person Chris    schedule 21.04.2019    source источник
comment
Выдает ошибку @Dharman извините   -  person Chris    schedule 21.04.2019
comment
Какая ошибка? Что вы пробовали? Я не вижу твой экран, помнишь?   -  person Dharman    schedule 21.04.2019
comment
Я использую postman для использования API, и он выдает эту ошибку, которая по какой-то причине на самом деле связана с кодом ответа http, но это происходит только тогда, когда я добавляю указанную выше строку. Это ошибка... ‹br /› ‹b›Ошибка синтаксического анализа‹/b›: синтаксическая ошибка, неожиданный «http_response_code» (T_STRING) в ‹b›C:\xampp\htdocs\api\product\read-merged. php‹/b› онлайн ‹b›79‹/b› ‹br /›   -  person Chris    schedule 21.04.2019
comment
Вы забыли ; после предыдущей строки...   -  person Dharman    schedule 21.04.2019
comment
убей меня, спасибо, я попробую   -  person Chris    schedule 21.04.2019
comment
Хорошо, нет ошибки, но вывод json не изменился   -  person Chris    schedule 21.04.2019
comment
Вау! Я не уверен, что смогу решить вашу проблему, но я чувствую плохой подход: это все, что я могу сказать с элементами, которые вы дали. То, как вы сами создаете JSON, выглядит странно (в большинстве случаев для генерации JSON вы создаете многомерный массив PHP, а затем превращаете его в json, используя json_encode). Я думаю, вам следует найти другой подход.   -  person Casimir et Hippolyte    schedule 22.04.2019
comment
Спасибо, я начинаю с многомерного массива. Сложность начинается с того, что я перебираю записи, чтобы найти повторяющиеся продукты, и объединяю данные о цене и дате. Каждый результат очистки — это новая запись в БД, поэтому их нужно смешивать вместе. На самом деле я обнаружил, что это очень похожая проблема, я просто не смог разобрать ее, чтобы применить к моей проблеме stackoverflow.com/questions/28393612/ Я полный нуб, поэтому подход с хорошей вероятностью неверен, но я продолжаю двигаться вперед, как я могу!   -  person Chris    schedule 22.04.2019


Ответы (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.

person Casimir et Hippolyte    schedule 21.04.2019
comment
Извините, это в значительной степени то, что @dharman предлагает выше, но это вообще не изменило вывод. - person Chris; 21.04.2019
comment
@Chris: нет, это не то, что Дхарман предложил выше. Внимательно прочитайте и посмотрите демонстрацию: 3v4l.org/CCgYF - person Casimir et Hippolyte; 21.04.2019
comment
@Chris: если ты не примешь мой ответ, я пойду войной против всех Крисов мира. - person Casimir et Hippolyte; 21.04.2019
comment
Да, вы правы, это действительно работает! Проблема в том, что я изо всех сил пытаюсь использовать его для решения своей проблемы. Данные, с которыми я работаю, не преобразуются в формат json до конца документа, а находятся в массиве. Я пытался заменить $arr на фактическое имя массива. Подождите, я опубликую код, который я использую для форматирования данных. - person Chris; 21.04.2019
comment
@Chris: Если вам нужно более подробно объяснить свои объяснения, отредактируйте свой вопрос. - person Casimir et Hippolyte; 21.04.2019
comment
Да, хорошо, позвольте мне добавить немного больше деталей. Спасибо @Casimir, помощь действительно приветствуется - person Chris; 21.04.2019
comment
Хорошо, добавил более подробную информацию к вопросу, который может помочь? - person Chris; 21.04.2019

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

$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);
person Danish Hakim Khan    schedule 21.04.2019