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}
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 emptyif( $obj ==new stdClass()){
echo "Object is empty";// JSON: {}}else{
echo "Object has properties";}
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:
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.
Outra solução possível que não precisa de vazamento para array:
// test setupclass X {private $p =1;}// private fields only => empty
$obj =new X;// $obj->x = 1;// test wrapped into a functionfunction object_empty( $obj ){foreach( $obj as $x )returnfalse;returntrue;}// inline test
$object_empty =true;foreach( $obj as $object_empty ){// value ignored ...
$object_empty =false;// ... because we set it falsebreak;}// test
var_dump( $object_empty, object_empty( $obj ));
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)
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.
classTest{}
$t =newTest();
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.
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}
Respostas:
Você pode lançar para uma matriz e, em seguida, verificar se ela está vazia ou não
fonte
empty($var)
equivalente a(!isset($var) || !$var)
. Você pode substituir seusempty($arr)
s por!$arr
desdearray() == FALSE
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 porqueempty()
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 queempty()
verifica se um array está "vazio", o que não é verdadeiro - isso é apenas um efeito colateral do que ele realmente faz.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:
OU
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):
Se SimpleXMLElement tiver mais de um nível de profundidade, você pode começar convertendo-o em uma matriz pura:
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:Fonte: http://php.net/manual/en/language.oop5.object-comparison.php
Editar : exemplo adicionado
fonte
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()
é especificamente para instâncias deSimpleXMLElement
e não para instâncias destdClass
. Eu acredito que tudo isso ainda funciona no PHP7.2.Você pode lançar seu objeto em uma matriz e testar sua contagem assim:
fonte
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.
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á noforeach
loop e retornaráfalse
imediatamente, não passando por todo o conjunto.fonte
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 exemplofonte
Outra solução possível que não precisa de vazamento para
array
:fonte
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
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:
fonte
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.
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 sertrue
, 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 (pensenew 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.fonte
ou
fonte
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:
fonte