PHP에서 객체가 비어 있는지 확인하는 방법은 무엇입니까?


답변:


130

배열로 캐스팅 한 다음 비어 있는지 여부를 확인할 수 있습니다.

$arr = (array)$obj;
if (!$arr) {
    // do stuff
}

9
: 나는 오류 얻을 수 있기 때문에 타입 캐스팅은 나를 위해 일을하지 않는 PHP 구문 분석 오류 : 구문 오류, 예기치 않은 '(배열)'(배열)에서 (T_ARRAY_CAST) 내가 사용하는 PHP 버전 5.4.28 첫 번째 옵션을 두 줄의 코드가 저에게 효과적입니다.
Coanda

WordPress 플러그인을 업로드 할 때 동일한 오류가 발생했으며 이전 버전의 PHP도 사용하는 것 같습니다.
Asaf

4
배열이 비어있는 경우 실제로 확인하지 않습니다 비어 empty($var)에 해당 (!isset($var) || !$var). 당신은 대체 할 수 있습니다 empty($arr)로들 !$arr부터array() == FALSE
디모데 죤

2
empty((array) $obj)PHP 5.4 이상에서 작동하지 않는 이유 는 한 줄의 형변환과 관련이 없습니다. empty()전달 된 변수에 대한 참조를 가져 오기 때문에 오류가 발생 하고 다른 변수에 해당 유형 변환 된 변수를 먼저 저장하지 않는 한 유형 변환시 참조를 가져올 수 없습니다. 이전 의견에서 설명한 내용 때문입니다. 이것이 사실이 아닌 empty()"비어있는"배열 인지 확인하는 것으로 사람들이 믿게 할 수 있기 때문에 이것이 받아 들여진 대답이라는 것은 다소 실망 스럽습니다 . 이것은 실제로하는 일의 부작용 일뿐입니다.
Timothy Zorn

PHP 7 이상에서 작동합니까, 아니면 올바른 수정 방법입니까?
kantsverma

32

편집 : 나는 그들이 SimpleXMLElement 객체가 비어 있는지 구체적으로 확인하고 싶어한다는 것을 깨닫지 못했습니다. 아래에 이전 답변을 남겼습니다.

업데이트 된 답변 (SimpleXMLElement) :

SimpleXMLElement의 경우 :

비어 있으면 속성이 없음을 의미합니다.

$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
    // no properties
}

또는

$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
    // empty array
}

SimpleXMLElement가 한 수준 깊이이고 비어 있으면 실제로 PHP가 거짓 (또는 속성 없음)으로 간주하는 속성 만 있음을 의미합니다 .

$obj = simplexml_load_file($url);
if ( !array_filter((array)$obj) )
{
    // all properties falsey or no properties at all
}

SimpleXMLElement가 한 수준 이상인 경우 순수한 배열로 변환하여 시작할 수 있습니다.

$obj = simplexml_load_file($url);
// `json_decode(json_encode($obj), TRUE)` can be slow because
// you're converting to and from a JSON string.
// I don't know another simple way to do a deep conversion from object to array
$array = json_decode(json_encode($obj), TRUE);
if ( !array_filter($array) )
{
    // empty or all properties falsey
}


이전 답변 (단순 개체) :

단순 객체 (유형 stdClass)가 완전히 비어 있는지 (키 / 값 없음) 확인하려면 다음을 수행 할 수 있습니다.

// $obj is type stdClass and we want to check if it's empty
if ( $obj == new stdClass() )
{
    echo "Object is empty"; // JSON: {}
}
else
{
    echo "Object has properties";
}

출처 : http://php.net/manual/en/language.oop5.object-comparison.php

편집 : 추가 된 예

$one = new stdClass();
$two = (object)array();

var_dump($one == new stdClass()); // TRUE
var_dump($two == new stdClass()); // TRUE
var_dump($one == $two); // TRUE

$two->test = TRUE;
var_dump($two == new stdClass()); // FALSE
var_dump($one == $two); // FALSE

$two->test = FALSE;
var_dump($one == $two); // FALSE

$two->test = NULL;
var_dump($one == $two); // FALSE

$two->test = TRUE;
$one->test = TRUE;
var_dump($one == $two); // TRUE

unset($one->test, $two->test);
var_dump($one == $two); // TRUE

PHP7.2에서 작동하지 않음 :PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen

2
@ 유하-untinen와 용액 ->count()구체적의 인스턴스이다 SimpleXMLElement하지의 인스턴스 stdClass. 이 모든 것이 여전히 PHP7.2에서 작동한다고 생각합니다.
Timothy Zorn

21

객체를 배열로 캐스트하고 다음과 같이 개수를 테스트 할 수 있습니다.

if(count((array)$obj)) {
   // doStuff
}

12

객체가 비어 있지 않고 상당히 크지 않은 경우 배열 또는 직렬화에 리소스를 낭비하는 이유는 무엇입니까?

이것은 JavaScript에서 사용하는 매우 쉬운 솔루션입니다. 객체를 배열로 캐스트하고 비어 있는지 확인하거나 JSON으로 인코딩하는 언급 된 솔루션과 달리이 간단한 함수는 간단한 작업을 수행하는 데 사용되는 리소스와 관련하여 매우 효율적입니다.

function emptyObj( $obj ) {
    foreach ( $obj AS $prop ) {
        return FALSE;
    }

    return TRUE;
}

이 솔루션은 매우 간단한 방식으로 작동합니다. 객체가 비어 있으면 foreach 루프에 전혀 들어 가지 않고 true. 비어 있지 않으면 foreach루프에 들어가서 false전체 세트를 통과하지 않고 즉시 돌아옵니다 .


8

사용 empty()때문에, 객체에 그것을 사용하는 경우 정상적으로 작동하지 않습니다 __isset()선언 된 경우 오버로드 메소드가 대신 호출됩니다.

따라서 count()(객체가 Countable 인 경우) 사용할 수 있습니다 .

또는 사용하여 get_object_vars()예를 들어

get_object_vars($obj) ? TRUE : FALSE;

7

캐스팅 할 필요가없는 또 다른 가능한 솔루션 array:

// test setup
class X { private $p = 1; } // private fields only => empty
$obj = new X;
// $obj->x = 1;


// test wrapped into a function
function object_empty( $obj ){
  foreach( $obj as $x ) return false;
  return true;
}


// inline test
$object_empty = true;
foreach( $obj as $object_empty ){ // value ignored ... 
  $object_empty = false; // ... because we set it false
  break;
}


// test    
var_dump( $object_empty, object_empty( $obj ) );

2

개체가 비어 있는지 확인하는 고유 한 안전한 방법은 없습니다.

PHP의 count ()는 먼저 배열로 캐스팅하지만 캐스팅은 빈 배열을 생성 할 수 있으며 객체가 구현되는 방법에 따라 다릅니다 (확장자의 객체는 종종 이러한 문제의 영향을받습니다)

귀하의 경우에는 $ obj-> count ();

http://it.php.net/manual/en/simplexmlelement.count.php

(이것은 php의 카운트가 아닙니다. http://www.php.net/count )


1

PHP에서 (bool)로 캐스팅하면 항목이 객체, 기본 유형 또는 null인지 즉시 알려줍니다. 다음 코드를 사용하십시오.

$obj = simplexml_load_file($url);

if (!(bool)$obj) {
    print "This variable is null, 0 or empty";
} else {
    print "Variable is an object or a primitive type!";
}

1
잘못된. $ x = 새로운 \ stdClass (); var_dump ((bool) $ x); 'true'를 인쇄합니다. 귀하의 경우, SimpleXML을 어떤 경우에는 false를 반환 할 수 있습니다
Quamis

옳은. new stdClass ()는 유효한 객체이므로 이것이 사실입니다. PHP 매뉴얼은 simplexml_load_file (), "XML 문서 내에 보관 된 데이터를 포함하는 속성을 가진 SimpleXMLElement 클래스의 객체를 반환하거나 실패하면 FALSE를 반환합니다."라고 말합니다. 따라서 (bool) simplexml_load_file ()을 캐스트하면 true (함수가 개체를 반환했기 때문에)가되지만 false (함수가 false를 반환했기 때문에)가됩니다.
roosevelt

0

객체가 "비어 있는지"여부는 정의의 문제이고 클래스가 나타내는 객체의 특성에 따라 다르기 때문에 클래스가 정의해야합니다.

PHP 자체는 클래스의 모든 인스턴스를 비어 있지 않은 것으로 간주합니다.

class Test { }
$t = new Test();
var_dump(empty($t));

// results in bool(false)

"빈"개체에 대한 일반 정의는있을 수 없습니다. 위의 예에서 결과는 다음과 empty()같아야 한다고 주장 할 수 있습니다.true 에서 객체가 콘텐츠를 나타내지 않기 때문에의 . 그러나 PHP는 어떻게 알 수 있습니까? 일부 객체는 콘텐츠를 나타 내기위한 것이 아니며 (예를 들어 팩토리를 생각해보십시오) 다른 객체는 항상 의미있는 값을 나타냅니다 (생각합니다 new DateTime()).

요컨대, 특정 개체에 대한 자체 기준을 제시하고 그에 따라 개체 외부에서 또는 개체의 자체 작성 isEmpty()방법에서 테스트해야 합니다.


0
$array = array_filter($array);
if(!empty($array)) {
    echo "not empty";
}

또는

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}

이것이 질문에 대한 답이 될 수 있지만, 당신이하고있는 일을 설명하기 위해 당신의 대답에 텍스트를 넣는 것은 항상 좋은 생각입니다. 좋은 답을 쓰는 방법을 읽으십시오 .
Jørgen R

-1

요청 후 문자열의 json_decode를 사용했습니다. 위의 어느 것도 나를 위해 일하지 않았으며 결국 이것을 사용했습니다.

$post_vals = json_decode($_POST['stuff']);

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.