2016-10-01 97 views
1

我有一个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对数组进行排序,但似乎无法提取循环密钥。

+0

请出示你已经尝试了什么至今 –

+0

我不知道如何给它PHP.That排序。这就是为什么我问这里是否有人可以点我在正确的方向 – Stefan

回答

1

你可以沿着这条路:

  1. 使用json_decode
  2. 迭代通过键$ service_prov_services的JSON转换为PHP数组。在该过程中:
    a)将service_type存储在一个数组中。在每次迭代检查项目是否属于这个值,然后推送到这个集合
    b)如果没有,然后创建新的集合,并推入。
  3. 在循环结束时,你将有service_type
  4. 使用这个集合的集合中service_prov_services
  5. 使用json_encode
数组转换回JSON

UPDATE

您的结果JSON有service_mea确定为字符串而不是数组。我的代码给出了数组。除了将UTF8键存储在映射器中之外,我遵循完全相同的步骤。

<?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" 
    } 
] 
+0

你能告诉我如何在代码中做到这一点? 我不是很熟练,它会帮助很多。 – Stefan