본문 바로가기
IT/programming

[PHP] nested JSON key 추출 / 재귀함수 활용, recursive call

by 어느해겨울 2022. 3. 3.

nested JSON 변환

PHP에서 재귀 함수를 이용해 nested 구조의 key들을 /로 구분 짓는 URI string으로 변환하는 예제이다.

이 또한 Restful API 구현에 필요한 기능의 일부이니 활용 가능한 환경이라면 도움이 되길 바란다.

 

이전에 python 으로 작성한 변환 방식과 유사하니 참고. 

https://muabow.tistory.com/327

 

[PYTHON] nested JSON 변환 / comparing two nested JSON

nested JSON 변환 예제 1. 재귀를 이용해 nested 구조의 key들을 flat 하게 만들어서 dictionary에 key/value 로 저장을 하는 예제이다. 소스코드 """ # JSON data format { "Key_A": "A", "Key_B": { "B_1": "..

muabow.tistory.com

 

소스코드

- 최대한 쉽게 구현하고자 했다. 입력된 json array에 하위에 array가 있는지, 더 이상 하위가 없는 마지막 key string인지 지속적으로 파악하는 기능을 수행한다.

 <?php
 	// JSON 포맷은 작성하기 귀찮아서 퍼옴..
	// https://opensource.adobe.com/Spry/samples/data_region/JSONDataSetSample.html
    
	$json_data = json_decode('{
		"id": "0001",
		"type": "donut",
		"name": "Cake",
		"ppu": 0.55,
		"batters":
			{
				"batter":
					[
						{ "id": "1001", "type": "Regular" },
						{ "id": "1002", "type": "Chocolate" },
						{ "id": "1003", "type": "Blueberry" },
						{ "id": "1004", "type": "Devils Food" }
					]
			},
		"topping":
			[
				{ "id": "5001", "type": "None" },
				{ "id": "5002", "type": "Glazed" },
				{ "id": "5005", "type": "Sugar" },
				{ "id": "5007", "type": "Powdered Sugar" },
				{ "id": "5006", "type": "Chocolate with Sprinkles" },
				{ "id": "5003", "type": "Chocolate" },
				{ "id": "5004", "type": "Maple" }
			]
	}', true);

	function parse_nested_json($_json, &$_path, $_parent = "" ) {
		$arr_key = array_keys($_json);

		foreach( $arr_key as $key ) {
			if( is_array($_json[$key]) ) {
				parse_nested_json($_json[$key], $_path, "{$_parent}/{$key}");
			
			} else {
				$_path[] = "{$_parent}/{$key}";
			}
		}

		return ;
	}
	
	$arr_json_list = array();
	parse_nested_json($json_data, $arr_json_list);

	var_dump($arr_json_list);

?>

 

결과

 array(26) {
  [0]=>
  string(3) "/id"
  [1]=>
  string(5) "/type"
  [2]=>
  string(5) "/name"
  [3]=>
  string(4) "/ppu"
  [4]=>
  string(20) "/batters/batter/0/id"
  [5]=>
  string(22) "/batters/batter/0/type"
  [6]=>
  string(20) "/batters/batter/1/id"
  [7]=>
  string(22) "/batters/batter/1/type"
  [8]=>
  string(20) "/batters/batter/2/id"
  [9]=>
  string(22) "/batters/batter/2/type"
  [10]=>
  string(20) "/batters/batter/3/id"
  [11]=>
  string(22) "/batters/batter/3/type"
  [12]=>
  string(13) "/topping/0/id"
  [13]=>
  string(15) "/topping/0/type"
  [14]=>
  string(13) "/topping/1/id"
  [15]=>
  string(15) "/topping/1/type"
  [16]=>
  string(13) "/topping/2/id"
  [17]=>
  string(15) "/topping/2/type"
  [18]=>
  string(13) "/topping/3/id"
  [19]=>
  string(15) "/topping/3/type"
  [20]=>
  string(13) "/topping/4/id"
  [21]=>
  string(15) "/topping/4/type"
  [22]=>
  string(13) "/topping/5/id"
  [23]=>
  string(15) "/topping/5/type"
  [24]=>
  string(13) "/topping/6/id"
  [25]=>
  string(15) "/topping/6/type"
}

 

혹시 key 가 아니라 key/value를 구하고 싶다면 위 소스코드를 수정해서 사용해도 되고 아래의 링크를 확인하자.

링크의 방식은 뭔가 좀 복잡해서 기회가 되면 간단하게 변경 해보려한다.

https://muabow.tistory.com/215

 

[PHP] array_walk_recursive와 배열 순회 탐색 소스코드 공유

array_walk_recursive, 배열 순회 탐색, 전체 경로 찾기 array_walk_recursive - 전체 배열을 포인터 위치와 상관없이 탐색한다. - 모든 요소에 콜백 함수를 사용할 수 있다. - 사용자가 정의한 함수를 재

muabow.tistory.com

 

끝.

댓글