Le typage ne fonctionne pas pour moi, car j'obtiens l'erreur: Erreur d' analyse PHP : erreur de syntaxe, inattendue '(array)' (array) (T_ARRAY_CAST) dans ... J'utilise la version 5.4.28 de PHP et la première option avec deux lignes de code fonctionnent pour moi.
Coanda
Eu la même erreur lors du téléchargement d'un plugin WordPress, il semble qu'ils utilisent également une ancienne version de PHP.
Asaf
4
empty ne vérifie pas réellement si un tableau est vide, empty($var)équivalent à (!isset($var) || !$var). Vous pouvez remplacer votre empty($arr)s par !$arrdepuisarray() == FALSE
Timothy Zorn
2
La raison empty((array) $obj)ne fonctionne pas dans PHP 5.4+ n'a rien à voir avec le typage sur une seule ligne. Vous obtenez l'erreur car empty()prend une référence aux variables qui lui sont transmises, et il ne peut pas obtenir de référence lors de la conversion de type à moins que vous ne stockiez d'abord cette variable convertie dans une autre variable. Il le fait à cause de ce que j'ai décrit dans mon commentaire précédent. C'est plutôt frustrant que ce soit la réponse acceptée car cela peut amener les gens à croire que empty()vérifie si un tableau est "vide", ce qui n'est pas vrai - c'est juste un effet secondaire de ce qu'il fait réellement.
Timothy Zorn
Cela fonctionnera-t-il en php 7+, ou est-ce la bonne façon de le réparer.
kantsverma
32
Edit : Je ne savais pas qu'ils voulaient spécifiquement vérifier si un objet SimpleXMLElement est vide. J'ai laissé l'ancienne réponse ci-dessous
Réponse mise à jour (SimpleXMLElement) :
Pour SimpleXMLElement:
Si par vide vous voulez dire n'a pas de propriétés:
$obj = simplexml_load_file($url);if(!$obj->count()){// no properties}
Si SimpleXMLElement a un niveau de profondeur et que vide, vous voulez dire qu'il n'a que des propriétés que PHP considère comme fausses (ou aucune propriété):
$obj = simplexml_load_file($url);if(!array_filter((array)$obj)){// all properties falsey or no properties at all}
Si SimpleXMLElement a plus d'un niveau de profondeur, vous pouvez commencer par le convertir en un tableau pur:
$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}
Ancienne réponse (objet simple) :
Si vous voulez vérifier si un objet simple (type stdClass) est complètement vide (pas de clés / valeurs), vous pouvez faire ce qui suit:
// $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";}
Ne fonctionne pas en PHP7.2:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen
2
@ juha-untinen La solution avec ->count()est spécifiquement pour les instances de SimpleXMLElementet non pour les instances de stdClass. Je crois que tout cela fonctionne toujours en PHP7.2.
Timothy Zorn
21
Vous pouvez convertir votre objet dans un tableau et tester son nombre comme ceci:
Imaginez si l'objet n'est pas vide et d'une manière assez grand, pourquoi gaspilleriez-vous les ressources pour le convertir en tableau ou le sérialiser ...
C'est une solution très simple que j'utilise en JavaScript. Contrairement à la solution mentionnée qui convertit un objet en tableau et vérifie s'il est vide, ou pour l'encoder en JSON, cette fonction simple est très efficace concernant les ressources utilisées pour effectuer une tâche simple.
function emptyObj( $obj ){foreach( $obj AS $prop ){return FALSE;}return TRUE;}
La solution fonctionne de manière très simple: elle n'entrera pas du tout dans une boucle foreach si l'objet est vide et il reviendra true. S'il n'est pas vide, il entrera dans la foreachboucle et reviendra falsetout de suite, sans passer par l'ensemble.
L'utilisation empty()ne fonctionnera pas comme d'habitude lors de son utilisation sur un objet, car la __isset()méthode de surcharge sera appelée à la place, si elle est déclarée.
Par conséquent, vous pouvez utiliser count()(si l'objet est dénombrable ).
Une autre solution possible qui n'a pas besoin d'être castée pour 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 ));
il n'y a pas de moyen sûr unique de vérifier si un objet est vide
php's count () effectue d'abord un cast en tableau, mais le cast peut produire un tableau vide, dépend de la façon dont l'objet est implémenté (les objets des extensions sont souvent affectés par ces problèmes)
dans votre cas, vous devez utiliser $ obj-> count ();
Si vous transtypez quelque chose en PHP comme un (booléen), il vous dira tout de suite si l'élément est un objet, un type primitif ou nul. Utilisez le code suivant:
$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!";}
faux. $ x = nouveau \ stdClass (); var_dump ((booléen) $ x); imprime «vrai»; Dans votre cas, simpleXml peut retourner faux dans certains cas
Quamis
Correct. new stdClass () est un objet valide, c'est pourquoi c'est vrai. Le manuel PHP dit, simplexml_load_file (), "Renvoie un objet de classe SimpleXMLElement avec des propriétés contenant les données contenues dans le document XML, ou FALSE en cas d'échec." Donc, si vous transtypez (booléen) simplexml_load_file (), ce sera vrai (car la fonction a renvoyé un objet) mais faux (car la fonction a renvoyé false).
roosevelt
0
Si un objet est "vide" ou non est une question de définition, et parce que cela dépend de la nature de l'objet que la classe représente, c'est à la classe de le définir.
PHP lui-même considère chaque instance d'une classe comme non vide.
classTest{}
$t =newTest();
var_dump(empty($t));// results in bool(false)
Il ne peut pas y avoir de définition générique pour un objet "vide". Vous pourriez argumenter dans l'exemple ci-dessus que le résultat de empty()devrait être true, car l'objet ne représente aucun contenu. Mais comment PHP doit-il savoir? Certains objets ne sont jamais destinés à représenter du contenu (pensez aux usines par exemple), d'autres représentent toujours une valeur significative (pensez new DateTime()).
En bref, vous devrez trouver vos propres critères pour un objet spécifique, et les tester en conséquence, soit de l'extérieur de l'objet, soit à partir d'une isEmpty()méthode auto-écrite dans l'objet.
Bien que cela puisse répondre à la question, c'est toujours une bonne idée de mettre du texte dans votre réponse pour expliquer ce que vous faites. Lisez comment rédiger une bonne réponse .
Jørgen R
-1
J'utilisais un json_decode d'une chaîne dans la demande de publication. Rien de ce qui précède n'a fonctionné pour moi, à la fin j'ai utilisé ceci:
$post_vals = json_decode($_POST['stuff']);if(json_encode($post_vals->object)!='{}'){// its not empty}
Réponses:
Vous pouvez effectuer un cast en un tableau puis vérifier s'il est vide ou non
la source
empty($var)
équivalent à(!isset($var) || !$var)
. Vous pouvez remplacer votreempty($arr)
s par!$arr
depuisarray() == FALSE
empty((array) $obj)
ne fonctionne pas dans PHP 5.4+ n'a rien à voir avec le typage sur une seule ligne. Vous obtenez l'erreur carempty()
prend une référence aux variables qui lui sont transmises, et il ne peut pas obtenir de référence lors de la conversion de type à moins que vous ne stockiez d'abord cette variable convertie dans une autre variable. Il le fait à cause de ce que j'ai décrit dans mon commentaire précédent. C'est plutôt frustrant que ce soit la réponse acceptée car cela peut amener les gens à croire queempty()
vérifie si un tableau est "vide", ce qui n'est pas vrai - c'est juste un effet secondaire de ce qu'il fait réellement.Edit : Je ne savais pas qu'ils voulaient spécifiquement vérifier si un objet SimpleXMLElement est vide. J'ai laissé l'ancienne réponse ci-dessous
Réponse mise à jour (SimpleXMLElement) :
Pour SimpleXMLElement:
Si par vide vous voulez dire n'a pas de propriétés:
OU
Si SimpleXMLElement a un niveau de profondeur et que vide, vous voulez dire qu'il n'a que des propriétés que PHP considère comme fausses (ou aucune propriété):
Si SimpleXMLElement a plus d'un niveau de profondeur, vous pouvez commencer par le convertir en un tableau pur:
Ancienne réponse (objet simple) :
Si vous voulez vérifier si un objet simple (type
stdClass
) est complètement vide (pas de clés / valeurs), vous pouvez faire ce qui suit:Source: http://php.net/manual/en/language.oop5.object-comparison.php
Edit : exemple ajouté
la source
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()
est spécifiquement pour les instances deSimpleXMLElement
et non pour les instances destdClass
. Je crois que tout cela fonctionne toujours en PHP7.2.Vous pouvez convertir votre objet dans un tableau et tester son nombre comme ceci:
la source
Imaginez si l'objet n'est pas vide et d'une manière assez grand, pourquoi gaspilleriez-vous les ressources pour le convertir en tableau ou le sérialiser ...
C'est une solution très simple que j'utilise en JavaScript. Contrairement à la solution mentionnée qui convertit un objet en tableau et vérifie s'il est vide, ou pour l'encoder en JSON, cette fonction simple est très efficace concernant les ressources utilisées pour effectuer une tâche simple.
La solution fonctionne de manière très simple: elle n'entrera pas du tout dans une boucle foreach si l'objet est vide et il reviendra
true
. S'il n'est pas vide, il entrera dans laforeach
boucle et reviendrafalse
tout de suite, sans passer par l'ensemble.la source
L'utilisation
empty()
ne fonctionnera pas comme d'habitude lors de son utilisation sur un objet, car la__isset()
méthode de surcharge sera appelée à la place, si elle est déclarée.Par conséquent, vous pouvez utiliser
count()
(si l'objet est dénombrable ).Ou en utilisant
get_object_vars()
, par exemplela source
Une autre solution possible qui n'a pas besoin d'être castée pour
array
:la source
il n'y a pas de moyen sûr unique de vérifier si un objet est vide
php's count () effectue d'abord un cast en tableau, mais le cast peut produire un tableau vide, dépend de la façon dont l'objet est implémenté (les objets des extensions sont souvent affectés par ces problèmes)
dans votre cas, vous devez utiliser $ obj-> count ();
http://it.php.net/manual/en/simplexmlelement.count.php
(ce n'est pas le décompte de php http://www.php.net/count )
la source
Si vous transtypez quelque chose en PHP comme un (booléen), il vous dira tout de suite si l'élément est un objet, un type primitif ou nul. Utilisez le code suivant:
la source
Si un objet est "vide" ou non est une question de définition, et parce que cela dépend de la nature de l'objet que la classe représente, c'est à la classe de le définir.
PHP lui-même considère chaque instance d'une classe comme non vide.
Il ne peut pas y avoir de définition générique pour un objet "vide". Vous pourriez argumenter dans l'exemple ci-dessus que le résultat de
empty()
devrait êtretrue
, car l'objet ne représente aucun contenu. Mais comment PHP doit-il savoir? Certains objets ne sont jamais destinés à représenter du contenu (pensez aux usines par exemple), d'autres représentent toujours une valeur significative (penseznew DateTime()
).En bref, vous devrez trouver vos propres critères pour un objet spécifique, et les tester en conséquence, soit de l'extérieur de l'objet, soit à partir d'une
isEmpty()
méthode auto-écrite dans l'objet.la source
ou
la source
J'utilisais un json_decode d'une chaîne dans la demande de publication. Rien de ce qui précède n'a fonctionné pour moi, à la fin j'ai utilisé ceci:
la source