개발-PHP

[함수] [수정]php 순환참조(RECURSION) 에 안전한 JSON, Array, Object 다루는 Tool 모음

WEBKIKIS 2016. 3. 30. 21:02
반응형

[함수] [수정]php 순환참조(RECURSION) 에 안전한 JSON, Array, Object 다루는 Tool 모음


json_encode, array_walk, array_map 등 순환참조에 안전하지 못한 함수의 대체용도로 사용할 수 있다.
 
정의 표현에 & 를 한 것은 실제로 & 를 쓰라는 의미가 아니고, 함수에서 &참조로 받는다는 의미이다.
 
XenoArray::each(&$변수, '함수명', ['클래스명']);
변수의 Array, Object 를 끝까지 탐색하여 함수명에 인자로 주고 리턴값으로 값을 변경한다.
 
$리턴 = XenoArray::eachTo(&$변수, '함수명', ['클래스명']);
::each() 와 같은일을 하지만 값을 변경하지 않고 새 변수로 리턴한다.
 
XenoArray::addArray(&$ArrayA, $ArrayB);
$ArrayA + $ArrayB 결과를 $ArrayA 에 저장한다. $ArrayB 의 키는 무시되고 순서대로 쌓인다.
 
XenoArray::addObject(&$ObjectA, $ObjectB);
$ObjectA + $ObjectB 결과를 $ObjectA 에 저장한다. 중복되는 키값은 덮어쓰여진다.
 
XenoArray::padding(&$Array, $PaddingKeysArray, ['value']);
$Array 에 $PaddingKeysArray 에 있는 키값이 없다면 value 값으로 배열을 생성한다.
pcre 에서 /(1)(2)?/ 같은 매칭의 경우 2 가 아예 정의되어 있지 않는 경우 등에 사용한다.
 
$jsonText = XenoArray::jsonEncode($Object, [JSON_OPTION]);
순환참조되는 $Object 의 경우 순환되는 부분에서 __RECURSIVE__ = 1 을 주고 잘라낸 후 json_encode() 한다.

추가.
json_encode() 의 경우 Recursion 을 복원도 할 수 있게 되면 좋을 것 같고,
serialize() 를 이용하면 굳이 배열을 일일히 뒤져서 순환참조를 찾아낼 필요가 없어서
 
XenoArray::removeRecursion() 과 XenoArray::recreateRecursion() 을 추가하고 XenoArray::jsonEncode() 내부에서 이를 이용하도록 수정.
 
 
$newObject = XenoArray::removeRecursion($Object, $referenceOnly = false);
$obj = (object)null;
$obj->a = &$obj; // 이것은 Reference 로 명시된 참조 이지만
$obj->b = $obj; // 이것은 직접 명시하지는 않았지만 복사되지 않고 참조만 되어 있다.

$referenceOnly 를 true 로 명시하면 $obj->b 같은 경우는 변환하지 않는다. (이렇게 되면 json_encode 시 오류 발생)
 
 
$newObject = XenoArray::recreateRecursive($Object);
 
자세한 사용 예는 첨부파일을 확인한다.

첨부는 블로그에 : http://blog.naver.com/crucifyer/150162662432

License : LGPL v3.0


by phpschool

반응형