2016-10-01 94 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