Объединить массив JSON в соответствии с ключом в PHP и извлечь повторяющиеся ключи

#php #json #merge #key #extract

#php #json #слияние #Клавиша #извлечение

Вопрос:

У меня есть массив JSON, который выглядит как:

 {
"error": false,
"service_prov_services": [
    {
        "service_measure": "Darmkrebsfrüherkennung (Schnelltest, Koloskopie)",
        "service_prov_type": "Doctor",
        "service_type": "Früherkennung und Vorsorge",
        "service_prov_name": "Dr. Test",
        "addr_street": "xxx Street"
    },
    {
        "service_measure": "Gesundheits-Check-up",
        "service_prov_type": "Doctor",
        "service_type": "Früherkennung und Vorsorge",
        "service_prov_name": "Dr. Test",
        "addr_street": "xxx Street"
    },

    {
        "service_measure": "Suchtmittelkonsum",
        "service_prov_type": "Doctor",
        "service_type": "Gesundheitskurse",
        "service_prov_name": "Dr. Test",
        "addr_street": "xxx Street"
    },
    {
        "service_measure": "Stressbewältigung oder Entspannung",
        "service_prov_type": "Doctor",
        "service_type": "Gesundheitskurse",
        "service_prov_name": "Dr. Test",
        "addr_street": "xxx Street"
    },
    {
        "service_measure": "Schutzimpfung",
        "service_prov_type": "Doctor",
        "service_type": "Sport und Gesundheit",
        "service_prov_name": "Dr. Test",
        "addr_street": "xxx Street"
    }
]
}
  

Я бы хотел, чтобы это был массив json в следующем формате.
Повторяющиеся значения ключей должны быть извлечены и должны быть отправлены только один раз.

     {
        "error": false,
        "service_prov_type": "Doctor",
        "service_prov_name": "Dr. Test",
        "addr_street": "xxx Street",
        "service_prov_services": [
          {
               "service_type": "Früherkennung und Vorsorge",
               "service_measure": "Darmkrebsfrüherkennung
                             (Schnelltest, Koloskopie)","Gesundheits-
                             Check-up"
           },
           {
               "service_type": "Gesundheitskurse",
               "service_measure": "Suchtmittelkonsum", 
                           "Stressbewältigung oder Entspannung"
           },
           {
               "service_type": "Sport und Gesundheit",
               "service_measure": "Schutzimpfung",
           }
        ]
    }
  

Кто-нибудь может указать, как это сделать?
Я могу отсортировать массив с помощью usort, но, похоже, я не могу извлечь повторяющиеся ключи.

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

1. Пожалуйста, покажите, что вы пробовали до сих пор

2. Я не знаю, как отсортировать его в PHP. Вот почему я спрашиваю здесь, может ли кто-нибудь указать мне правильное направление

Ответ №1:

Вы можете следовать по этому пути:

  1. преобразуйте json в массив PHP с помощью json_decode
  2. выполните итерацию по ключу $service_prov_services. По ходу:
    а) сохраните service_type в массиве. На каждой итерации проверяйте, принадлежит ли элемент этому значению, затем нажмите на эту коллекцию
    б) если нет, то создайте новую коллекцию и вставьте ее.
    1. В конце цикла у вас будут коллекции service_type
    2. Используйте эту коллекцию в service_prov_services
    3. преобразуйте массив обратно в json с помощью json_encode

Обновить

Ваш результирующий JSON имеет service_measure в виде строки, а не массива. Мой код выдает это как массив. Я выполнил точно те же шаги, за исключением сохранения ключей UTF8 в mapper.

 <?php

ini_set('display_errors', 'On');
error_reporting(E_ALL);

$json = <<<EOF
{
    "error": false,
    "service_prov_services": [
        {
            "service_measure": "Darmkrebsfr?herkennung (Schnelltest, Koloskopie)",
            "service_prov_type": "Doctor",
            "service_type": "Fr?herkennung und Vorsorge",
            "service_prov_name": "Dr. Test",
            "addr_street": "xxx Street"
        },
        {
            "service_measure": "Gesundheits-Check-up",
            "service_prov_type": "Doctor",
            "service_type": "Fr?herkennung und Vorsorge",
            "service_prov_name": "Dr. Test",
            "addr_street": "xxx Street"
        },
        {
            "service_measure": "Suchtmittelkonsum",
            "service_prov_type": "Doctor",
            "service_type": "Gesundheitskurse",
            "service_prov_name": "Dr. Test",
            "addr_street": "xxx Street"
        },
        {
            "service_measure": "Stressbew?ltigung oder Entspannung",
            "service_prov_type": "Doctor",
            "service_type": "Gesundheitskurse",
            "service_prov_name": "Dr. Test",
            "addr_street": "xxx Street"
        },
        {
            "service_measure": "Schutzimpfung",
            "service_prov_type": "Doctor",
            "service_type": "Sport und Gesundheit",
            "service_prov_name": "Dr. Test",
            "addr_street": "xxx Street"
        }
    ]
}
EOF;

$listArr = json_decode($json, TRUE);

$service_type = array();
$service_prov_services = array();

$mapper = array();
$entry_list = array();
$mapIndex = 0;  //initialize map index at zero


foreach($listArr['service_prov_services'] as $collection){

    if(in_array($collection['service_type'], array_values($mapper))){
            //make edit to existing entry by pusing service_measure

            //extract the index from mapper now
            foreach($mapper as $key=>$value){
                if($value == $collection['service_type']){
                    $needle = $key;
                    break;
                }
            }

            $arr_service_measure_old = (array)$entry_list[$needle]['service_measure'];
            $arr_service_measure_old[] = $collection['service_measure'];

            //update the array
            $entry_list[$needle] = array(
                'service_type'      =>  $collection['service_type'],
                'service_measure'   =>  $arr_service_measure_old,
            );

    }else{
            //new entry needs to be made
            $currentMapIndex = $mapIndex;
            $mapper[$mapIndex  ] = $collection['service_type'];

            $entry_list[$currentMapIndex] = array(
                'service_type'      =>  $collection['service_type'],
                'service_measure'   =>  $collection['service_measure'],
            );

    }

}

echo json_encode($entry_list);
  

Результирующий JSON равен :

 [
    {
        "service_type": "Fr?herkennung und Vorsorge",
        "service_measure": [
            "Darmkrebsfr?herkennung (Schnelltest, Koloskopie)",
            "Gesundheits-Check-up"
        ]
    },
    {
        "service_type": "Gesundheitskurse",
        "service_measure": [
            "Suchtmittelkonsum",
            "Stressbew?ltigung oder Entspannung"
        ]
    },
    {
        "service_type": "Sport und Gesundheit",
        "service_measure": "Schutzimpfung"
    }
]
  

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

1. Не могли бы вы рассказать мне, как это сделать в коде, возможно? Я не очень опытный, и это очень помогло бы.