Como verificar se um objeto está vazio no PHP?

Respostas:

130

Você pode lançar para uma matriz e, em seguida, verificar se ela está vazia ou não

$arr = (array)$obj;
if (!$arr) {
    // do stuff
}
Peter Kelly
fonte
9
O typecasting não funciona para mim, porque recebo o erro: Erro de análise de PHP : erro de sintaxe, inesperado '(array)' (array) (T_ARRAY_CAST) em ... Eu uso o PHP versão 5.4.28 e a primeira opção com duas linhas de código funcionam para mim.
Coanda de
Teve o mesmo erro ao enviar um plugin do WordPress, parece que eles também usam uma versão anterior do PHP.
Asaf
4
empty não verifica se um array está vazio, empty($var)equivalente a (!isset($var) || !$var). Você pode substituir seus empty($arr)s por !$arrdesdearray() == FALSE
Timothy Zorn
2
A razão para empty((array) $obj)não funcionar no PHP 5.4+ não tem nada a ver com typecasting em uma linha. Você obtém o erro porque empty()leva uma referência às variáveis ​​passadas a ele e não pode obter uma referência durante a conversão de tipo, a menos que primeiro você armazene essa variável projetada em outra variável. Isso ocorre por causa do que descrevi em meu comentário anterior. É bastante frustrante que essa seja a resposta aceita, pois pode levar as pessoas a acreditarem que empty()verifica se um array está "vazio", o que não é verdadeiro - isso é apenas um efeito colateral do que ele realmente faz.
Timothy Zorn
Vai funcionar no php 7 ou mais, ou é a maneira certa de consertá-lo.
kantsverma
32

Edit : Eu não percebi que eles queriam verificar especificamente se um objeto SimpleXMLElement está vazio. Eu deixei a velha resposta abaixo

Resposta atualizada (SimpleXMLElement) :

Para SimpleXMLElement:

Se por vazio você quer dizer não tem propriedades:

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

OU

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

Se SimpleXMLElement tiver um nível de profundidade e por vazio, você realmente quer dizer que ele só possui propriedades que o PHP considera falsey (ou nenhuma propriedade):

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

Se SimpleXMLElement tiver mais de um nível de profundidade, você pode começar convertendo-o em uma matriz pura:

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


Resposta Antiga (objeto simples) :

Se você deseja verificar se um objeto simples (tipo stdClass) está completamente vazio (sem chaves / valores), você pode fazer o seguinte:

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

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

Editar : exemplo adicionado

$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
Timothy Zorn
fonte
Não funciona no PHP7.2:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen
2
@ juha-untinen A solução com ->count()é especificamente para instâncias de SimpleXMLElemente não para instâncias de stdClass. Eu acredito que tudo isso ainda funciona no PHP7.2.
Timothy Zorn
21

Você pode lançar seu objeto em uma matriz e testar sua contagem assim:

if(count((array)$obj)) {
   // doStuff
}
Mohamed23gharbi
fonte
12

Imagine se o objeto não está vazio e de uma forma bastante grande, por que você desperdiçaria recursos para convertê-lo em um array ou serializá-lo ...

Esta é uma solução muito fácil que uso em JavaScript. Ao contrário da solução mencionada que converte um objeto em array e verifica se está vazio, ou para codificá-lo em JSON, esta função simples é muito eficiente em relação aos recursos usados ​​para realizar uma tarefa simples.

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

    return TRUE;
}

A solução funciona de uma maneira muito simples: ele não entrará em um loop foreach se o objeto estiver vazio e ele retornará true. Se não estiver vazio, ele entrará no foreachloop e retornará falseimediatamente, não passando por todo o conjunto.

Stamat
fonte
8

O uso empty()não funcionará normalmente ao usá-lo em um objeto, porque o __isset()método de sobrecarga será chamado, se declarado.

Portanto, você pode usar count()(se o objeto for Contável ).

Ou usando get_object_vars(), por exemplo

get_object_vars($obj) ? TRUE : FALSE;
Kenorb
fonte
7

Outra solução possível que não precisa de vazamento para 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 ) );
biziclop
fonte
2

não há uma maneira única e segura de verificar se um objeto está vazio

O count () do php converte primeiro em array, mas o casting pode produzir um array vazio, depende de como o objeto é implementado (objetos de extensões são freqüentemente afetados por esses problemas)

no seu caso, você deve usar $ obj-> count ();

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

(isso não é a contagem de php http://www.php.net/count )


fonte
1

Se você converter qualquer coisa no PHP como um (bool), ele dirá imediatamente se o item é um objeto, tipo primitivo ou nulo. Use o seguinte código:

$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!";
}
Roosevelt
fonte
1
errado. $ x = new \ stdClass (); var_dump ((bool) $ x); imprime 'verdadeiro'; No seu caso, simpleXml pode retornar falso em alguns casos
Quamis
Corrigir. new stdClass () é um objeto válido, por isso é verdade. O manual do PHP diz, simplexml_load_file (), "Retorna um objeto da classe SimpleXMLElement com propriedades contendo os dados mantidos no documento XML, ou FALSE em caso de falha." Portanto, se você lançar (bool) simplexml_load_file (), será verdadeiro (porque a função retornou um objeto), mas falso (porque a função retornou falso).
roosevelt,
0

Se um objeto está "vazio" ou não, é uma questão de definição, e porque depende da natureza do objeto que a classe representa, cabe à classe definir.

O próprio PHP considera cada instância de uma classe como não vazia.

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

// results in bool(false)

Não pode haver uma definição genérica para um objeto "vazio". Você pode argumentar no exemplo acima que o resultado de empty()deveria ser true, porque o objeto não representa nenhum conteúdo. Mas como o PHP deve saber? Alguns objetos nunca têm o objetivo de representar conteúdo (pense em fábricas, por exemplo), outros sempre representam um valor significativo (pense new DateTime()).

Em suma, você terá que criar seus próprios critérios para um objeto específico e testá-los de acordo, seja de fora do objeto ou de um isEmpty()método autoescrito no objeto.

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

ou

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}
Muhammad Tahir
fonte
Embora isso possa responder à pergunta, é sempre uma boa ideia incluir algum texto em sua resposta para explicar o que você está fazendo. Leia como escrever uma boa resposta .
Jørgen R
-1

Eu estava usando um json_decode de uma string na solicitação de postagem. Nenhuma das opções acima funcionou para mim, no final eu usei isto:

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

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
Frank conry
fonte