#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:
Вы можете следовать по этому пути:
- преобразуйте json в массив PHP с помощью json_decode
- выполните итерацию по ключу $service_prov_services. По ходу:
а) сохранитеservice_type
в массиве. На каждой итерации проверяйте, принадлежит ли элемент этому значению, затем нажмите на эту коллекцию
б) если нет, то создайте новую коллекцию и вставьте ее.- В конце цикла у вас будут коллекции
service_type
- Используйте эту коллекцию в
service_prov_services
- преобразуйте массив обратно в 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. Не могли бы вы рассказать мне, как это сделать в коде, возможно? Я не очень опытный, и это очень помогло бы.