2009-09-07 5 views
19

PHP로 JSON 데이터를 읽고 그 데이터에 빈 오브젝트 (예 : {})가 있습니다. 그래서 문제는 객체가 다른 방식으로 비어있는 경우를 처리해야하지만 검사를 수행 할 수있는 충분한 방법을 찾을 수 없다는 것입니다. empty(get_object_vars(object))은 너무 무섭고 매우 비효율적으로 보입니다. 수표를 발행 할 좋은 방법이 있습니까?PHP에서 JSON 객체가 비어 있는지 확인하는 방법은 무엇입니까?

+0

관련 : https://stackoverflow.com/q/9412126/3995261 – YakovL

답변

22

얼마나 많은 객체 empty(get_object_vars($object)) 또는 배열로 캐스팅하지 않으면 주요 속도가 느려지거나 병목 현상이 발생하지 않는다면 걱정할 필요가 없습니다. 그렉의 솔루션은 괜찮습니다.

나는 JSON 데이터를 디코딩 할 때, 그래도하여 $associative 플래그를 사용하는 것이 좋습니다 것 :

json_decode($data, true) 

이 일반 오래된 PHP 배열로 대신 stdClass 개체로 JSON 객체를 디코딩. 그런 다음 empty()을 사용하여 빈 오브젝트를 확인하고 stdClass을 사용하는 대신 사용자 정의 클래스의 오브젝트를 작성할 수 있습니다. 이는 장기적으로는 좋은 아이디어입니다.

24

당신은 배열 (불행하게도 당신이 empty()에 대한 호출 내에서이 작업을 수행 할 수 없습니다에 캐스팅 수 :

$x = (array)$obj; 
if (empty($x)) 
    ... 

또는 배열과 count() 캐스트 :

if (count((array)$obj)) 
    ... 
+0

get_object_vars와 같지 않습니까? 나는. 정말 효율적이지 않습니까? :) – vava

+2

필자는 테스트를하지 않았지만 성능 문제가 있고 병목 현상이라고 판단한 경우가 아니면 걱정할 필요가 없다고 생각합니다. – Greg

+1

C++ 프로그래머라면 불필요한 배열 변환에 대해 걱정할 필요가 없습니다. 비트가 설정되어 있으면 빠른 검사 만 수행해야하는 메모리 할당 및 복사 작업을 의미합니다. – vava

0

개체가 비어 있는지 여부를 알려야했지만 개인 및 보호 된 속성을 무시해야하므로이 작업을 수행 할 수있는 작은 기능을 만들었습니다.

function empty_obj(&$object, $ignore_private = true, $ignore_protected = true) { 
    $obj_name = get_class($object); 
    $obj = (array)$object; 

    foreach(array_keys($obj) as $prop) { 
    $is_private = $is_protected = false; 

    $prop = preg_replace("/[^\w*]/", '', $prop); 
    $prop_name = str_replace(array($obj_name, '*'), '', $prop); 

    if(preg_match("~^$obj_name$prop_name$~", $prop)) 
     $is_private = true; 
    if(preg_match("~^\*$prop_name$~", $prop)) 
     $is_protected = true; 

    if(!$is_private || !$is_protected || ($is_private && !$ignore_private) || ($is_protected && !$ignore_protected)) 
     return; 
    } 
    return true; 
} 
0

이것이 배열에 캐스트하는 것보다 효과적인지 또는 덜 효과적인지는 모르겠지만 더 많이 추측합니다. 객체를 반복 할 수 있고 무언가를 찾자 마자 대답이 나오고 반복을 멈출 수 있습니다.

function is_obj_empty($obj){ 
    if(is_null($obj)){ 
     return true; 
    } 
    foreach($obj as $key => $val){ 
     return false; 
    } 
    return true; 
} 
3

시도 empty()를 사용하지 않고 인 : PHP docs

get_object_vars($obj) ? TRUE : FALSE; 

우리는 메모를 읽을 수 있습니다

액세스 개체 속성에 empty()을 사용하여 __isset() 오버로드 메서드가 호출됩니다 , 선언 된 경우.

empty()을 사용하면 __get() 메서드를 사용하는 객체에서 항상 True를 반환합니다.

관련 문제