Как проверить, что объект пуст в PHP? - PullRequest
85 голосов
/ 23 февраля 2012

Как узнать, является ли объект пустым или нет в PHP.

Ниже приведен код, в котором $obj содержит данные XML.Как я могу проверить, пусто оно или нет?

Мой код:

$obj = simplexml_load_file($url);

Ответы [ 11 ]

109 голосов
/ 23 февраля 2012

Вы можете привести к массиву и затем проверить, является ли он пустым или нет

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

Редактировать: однострочная приведение типов, как показано ниже, не работает в PHP 5.4:

if (empty((array) $obj)) {
    //do stuff
}
29 голосов
/ 15 марта 2015

Редактировать : Я не понял, что они хотели специально проверить, является ли объект SimpleXMLElement пустым. Я оставил старый ответ ниже

Обновленный ответ (SimpleXMLElement) :

Для SimpleXMLElement:

Если под пустым вы подразумеваете, что не имеет свойств:

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

OR

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

Если SimpleXMLElement имеет глубину в один уровень, и под пустым вы на самом деле имеете в виду, что он имеет только свойства PHP считает Falsey (или не имеет свойств):

$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
14 голосов
/ 06 мая 2014

Вы можете привести ваш объект в массив и проверить его количество следующим образом:

if(count((array)$obj)) {
   // doStuff
}
7 голосов
/ 15 августа 2014

Представьте, что если объект не пустой и довольно большой, зачем вам тратить ресурсы на его преобразование в массив или сериализацию ...

Это очень простое решение, которое я использую в JavaScript,В отличие от упомянутого решения, которое преобразует объект в массив и проверяет, является ли он пустым или кодирует его в JSON, эта простая функция очень эффективна в отношении используемых ресурсов для выполнения простой задачи.

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

    return TRUE;
}

Решениеработает очень просто: он вообще не войдет в цикл foreach, если объект пуст и вернет true.Если он не пустой, он войдет в цикл foreach и сразу вернет false, не пройдя весь набор.

7 голосов
/ 13 августа 2013

Другое возможное решение, которое не нуждается в приведении к 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 ) );
6 голосов
/ 05 марта 2015

Использование empty() не будет работать как обычно при использовании его на объекте, потому что вместо него будет вызываться метод перегрузки __isset(), если он объявлен.

Поэтому вы можете использовать count() (еслиобъект Счетный ).

Или с помощью get_object_vars(), например

get_object_vars($obj) ? TRUE : FALSE;
2 голосов
/ 23 февраля 2012

нет уникального безопасного способа проверить, является ли объект пустым

php count () сначала приводит к массиву, но приведение может создать пустой массив, в зависимости от того, как реализован объект (объекты расширенийчасто затрагиваются этими проблемами)

в вашем случае вы должны использовать $ obj-> count ();

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

(это не число php http://www.php.net/count)

1 голос
/ 17 июля 2014

Если вы приведете что-либо в PHP как (bool), он сразу скажет вам, является ли объект объектом, примитивным типом или нулем. Используйте следующий код:

$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!";
}
0 голосов
/ 09 апреля 2015
$array = array_filter($array);
if(!empty($array)) {
    echo "not empty";
}

или

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}
0 голосов
/ 13 августа 2014

Я использовал json_decode строки в пост-запросе. Ничто из вышеперечисленного не помогло мне, в конце концов я использовал это:

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

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...