[함수] [수정]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
'개발-PHP' 카테고리의 다른 글
[함수] [함수 셀렉트박스] 만들기 처음으로 올림 ㅋ (0) | 2016.03.30 |
---|---|
[함수] set_error_handler 함수 한계 극복하기 (0) | 2016.03.30 |
[함수] 다들 아실것 같지만...올려봐요,,자릿수만큼 문자열 채우기... (0) | 2016.03.30 |
[함수] redis_cache (그누보드 함수캐쉬. redis 버젼) (0) | 2016.03.30 |
[함수] explode 3번째 인자. a=b=c=d ==> "a" => "b=c=d" (0) | 2016.03.30 |