How to check that an object is empty in PHP?

前端 未结 11 1993
不思量自难忘°
不思量自难忘° 2020-11-29 03:31

How to find if an object is empty or not in PHP.

Following is the code in which $obj is holding XML data. How can I check if it\'s empty or not?

相关标签:
11条回答
  • 2020-11-29 04:08

    I was using a json_decode of a string in post request. None of the above worked for me, in the end I used this:

    $post_vals = json_decode($_POST['stuff']);
    
    if(json_encode($post_vals->object) != '{}')
    {
        // its not empty
    }
    
    0 讨论(0)
  • 2020-11-29 04:09
    $array = array_filter($array);
    if(!empty($array)) {
        echo "not empty";
    }
    

    or

    if(count($array) > 0) {
        echo 'Error';
    } else {
        echo 'No Error';
    }
    
    0 讨论(0)
  • 2020-11-29 04:12

    You can cast your object into an array, and test its count like so:

    if(count((array)$obj)) {
       // doStuff
    }
    
    0 讨论(0)
  • 2020-11-29 04:13

    Edit: I didn't realize they wanted to specifically check if a SimpleXMLElement object is empty. I left the old answer below

    Updated Answer (SimpleXMLElement):

    For SimpleXMLElement:

    If by empty you mean has no properties:

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

    OR

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

    If SimpleXMLElement is one level deep, and by empty you actually mean that it only has properties PHP considers falsey (or no properties):

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

    If SimpleXMLElement is more than one level deep, you can start by converting it to a pure array:

    $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
    }
    


    Old Answer (simple object):

    If you want to check if a simple object (type stdClass) is completely empty (no keys/values), you can do the following:

    // $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";
    }
    

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

    Edit: added example

    $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
    
    0 讨论(0)
  • 2020-11-29 04:13

    Imagine if the object is not empty and in a way quite big, why would you waste the resources to cast it to array or serialize it...

    This is a very easy solution I use in JavaScript. Unlike the mentioned solution that casts an object to array and check if it is empty, or to encode it into JSON, this simple function is very efficient concerning used resources to perform a simple task.

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

    The solution works in a very simple manner: It wont enter a foreach loop at all if the object is empty and it will return true. If it's not empty it will enter the foreach loop and return false right away, not passing through the whole set.

    0 讨论(0)
  • 2020-11-29 04:13

    there's no unique safe way to check if an object is empty

    php's count() first casts to array, but casting can produce an empty array, depends by how the object is implemented (extensions' objects are often affected by those issues)

    in your case you have to use $obj->count();

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

    (that is not php's count http://www.php.net/count )

    0 讨论(0)
提交回复
热议问题