Das Typecasting funktioniert bei mir nicht, da ich den Fehler erhalte: PHP Parse error: Syntaxfehler, unerwartetes '(Array)' (Array) (T_ARRAY_CAST) in ... Ich verwende PHP Version 5.4.28 und die erste Option mit Zwei Codezeilen funktionieren bei mir.
Coanda
Hatte den gleichen Fehler beim Hochladen eines WordPress-Plugins, scheint, dass sie auch eine ältere Version von PHP verwenden.
Asaf
4
entleeren prüft nicht eigentlich , wenn ein Feld leer ist , ist empty($var)äquivalent (!isset($var) || !$var). Sie können Ihre empty($arr)s durch !$arrseitarray() == FALSE
Timothy Zorn
2
Der Grund, empty((array) $obj)der in PHP 5.4+ nicht funktioniert, hat nichts mit Typografie in einer Zeile zu tun. Sie erhalten den Fehler, weil empty()ein Verweis auf die an ihn übergebenen Variablen verwendet wird und beim Typisieren kein Verweis abgerufen werden kann, es sei denn, Sie speichern diese typisierte Variable zuerst in einer anderen Variablen. Dies geschieht aufgrund dessen, was ich in meinem vorherigen Kommentar beschrieben habe. Es ist ziemlich frustrierend, dass dies die akzeptierte Antwort ist, da die Leute glauben können, dass empty()überprüft wird, ob ein Array "leer" ist, was nicht stimmt - das ist nur ein Nebeneffekt dessen, was es tatsächlich tut.
Timothy Zorn
Funktioniert es in PHP 7+ oder ist es der richtige Weg, dies zu beheben?
Kantsverma
32
Bearbeiten : Ich wusste nicht, dass sie speziell prüfen wollten, ob ein SimpleXMLElement-Objekt leer ist. Ich habe die alte Antwort unten hinterlassen
Aktualisierte Antwort (SimpleXMLElement) :
Für SimpleXMLElement:
Wenn mit leer gemeint ist, hat keine Eigenschaften:
$obj = simplexml_load_file($url);if(!$obj->count()){// no properties}
Wenn SimpleXMLElement eine Ebene tief ist und leer bedeutet, bedeutet es tatsächlich, dass es nur Eigenschaften hat, die PHP als falsch betrachtet (oder keine Eigenschaften):
$obj = simplexml_load_file($url);if(!array_filter((array)$obj)){// all properties falsey or no properties at all}
Wenn SimpleXMLElement mehr als eine Ebene tief ist, können Sie es zunächst in ein reines Array konvertieren:
$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}
Alte Antwort (einfaches Objekt) :
Wenn Sie überprüfen möchten, ob ein einfaches Objekt (Typ stdClass) vollständig leer ist (keine Schlüssel / Werte), können Sie Folgendes tun:
// $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";}
Funktioniert nicht in PHP7.2:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen
2
@ juha-untinen Die Lösung mit ->count()ist speziell für Instanzen von SimpleXMLElementund nicht für Instanzen von stdClass. Ich glaube, all dies funktioniert immer noch in PHP7.2.
Timothy Zorn
21
Sie können Ihr Objekt in ein Array umwandeln und seine Anzahl folgendermaßen testen:
Stellen Sie sich vor, wenn das Objekt nicht leer und in gewisser Weise ziemlich groß ist, warum würden Sie die Ressourcen verschwenden, um es in ein Array umzuwandeln oder zu serialisieren ...
Dies ist eine sehr einfache Lösung, die ich in JavaScript verwende. Im Gegensatz zu der erwähnten Lösung, mit der ein Objekt in ein Array umgewandelt und überprüft wird, ob es leer ist, oder um es in JSON zu codieren, ist diese einfache Funktion in Bezug auf verwendete Ressourcen zur Ausführung einer einfachen Aufgabe sehr effizient.
function emptyObj( $obj ){foreach( $obj AS $prop ){return FALSE;}return TRUE;}
Die Lösung funktioniert auf sehr einfache Weise: Sie tritt überhaupt nicht in eine foreach-Schleife ein, wenn das Objekt leer ist und zurückkehrt true. Wenn es nicht leer ist, tritt es in die foreachSchleife ein und kehrt falsesofort zurück, ohne den gesamten Satz zu durchlaufen.
Die Verwendung empty()funktioniert nicht wie gewohnt, wenn sie für ein Objekt verwendet wird, da __isset()stattdessen die Überladungsmethode aufgerufen wird, wenn sie deklariert ist.
Daher können Sie verwenden count()(wenn das Objekt zählbar ist ).
Eine weitere mögliche Lösung, für die kein Casting erforderlich ist 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 ));
Es gibt keine eindeutige sichere Methode, um zu überprüfen, ob ein Objekt leer ist
PHPs count () wird zuerst in ein Array umgewandelt, aber das Casting kann ein leeres Array erzeugen. Dies hängt davon ab, wie das Objekt implementiert ist (die Objekte von Erweiterungen sind häufig von diesen Problemen betroffen).
in deinem Fall musst du $ obj-> count () verwenden;
Wenn Sie etwas in PHP als (bool) umwandeln, erfahren Sie sofort, ob es sich bei dem Element um ein Objekt, einen primitiven Typ oder eine Null handelt. Verwenden Sie den folgenden Code:
$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!";}
falsch. $ x = new \ stdClass (); var_dump ((bool) $ x); druckt 'wahr'; In Ihrem Fall kann simpleXml in einigen Fällen false zurückgeben
Quamis
Richtig. new stdClass () ist ein gültiges Objekt, deshalb ist es wahr. Im PHP-Handbuch heißt es in simplexml_load_file (): "Gibt ein Objekt der Klasse SimpleXMLElement mit Eigenschaften zurück, die die im XML-Dokument enthaltenen Daten enthalten, oder FALSE bei einem Fehler." Wenn Sie also (bool) simplexml_load_file () umwandeln, ist dies wahr (weil die Funktion ein Objekt zurückgegeben hat), aber falsch (weil die Funktion false zurückgegeben hat).
Roosevelt
0
Wenn ein Objekt "leer" ist oder nicht, ist dies eine Frage der Definition. Da dies von der Art des Objekts abhängt, das die Klasse darstellt, muss die Klasse es definieren.
PHP selbst betrachtet jede Instanz einer Klasse als nicht leer.
classTest{}
$t =newTest();
var_dump(empty($t));// results in bool(false)
Es kann keine generische Definition für ein "leeres" Objekt geben. Sie könnten im obigen Beispiel argumentieren, dass das Ergebnis von empty()sein sollte true, da das Objekt keinen Inhalt darstellt. Aber woher soll PHP das wissen? Einige Objekte sollen niemals Inhalte darstellen (z. B. Think Factories), andere stellen immer einen sinnvollen Wert dar (Think new DateTime()).
Kurz gesagt, Sie müssen Ihre eigenen Kriterien für ein bestimmtes Objekt erstellen und diese entsprechend testen, entweder von außerhalb des Objekts oder von einer selbst geschriebenen isEmpty()Methode im Objekt.
Während dies die Frage beantworten kann, ist es immer eine gute Idee, einen Text in Ihre Antwort einzufügen, um zu erklären, was Sie tun. Lesen Sie, wie Sie eine gute Antwort schreiben .
Jørgen R
-1
Ich habe einen json_decode eines Strings in der Post-Anfrage verwendet. Keines der oben genannten hat bei mir funktioniert, am Ende habe ich Folgendes verwendet:
$post_vals = json_decode($_POST['stuff']);if(json_encode($post_vals->object)!='{}'){// its not empty}
Antworten:
Sie können in ein Array umwandeln und dann prüfen, ob es leer ist oder nicht
quelle
empty($var)
äquivalent(!isset($var) || !$var)
. Sie können Ihreempty($arr)
s durch!$arr
seitarray() == FALSE
empty((array) $obj)
der in PHP 5.4+ nicht funktioniert, hat nichts mit Typografie in einer Zeile zu tun. Sie erhalten den Fehler, weilempty()
ein Verweis auf die an ihn übergebenen Variablen verwendet wird und beim Typisieren kein Verweis abgerufen werden kann, es sei denn, Sie speichern diese typisierte Variable zuerst in einer anderen Variablen. Dies geschieht aufgrund dessen, was ich in meinem vorherigen Kommentar beschrieben habe. Es ist ziemlich frustrierend, dass dies die akzeptierte Antwort ist, da die Leute glauben können, dassempty()
überprüft wird, ob ein Array "leer" ist, was nicht stimmt - das ist nur ein Nebeneffekt dessen, was es tatsächlich tut.Bearbeiten : Ich wusste nicht, dass sie speziell prüfen wollten, ob ein SimpleXMLElement-Objekt leer ist. Ich habe die alte Antwort unten hinterlassen
Aktualisierte Antwort (SimpleXMLElement) :
Für SimpleXMLElement:
Wenn mit leer gemeint ist, hat keine Eigenschaften:
ODER
Wenn SimpleXMLElement eine Ebene tief ist und leer bedeutet, bedeutet es tatsächlich, dass es nur Eigenschaften hat, die PHP als falsch betrachtet (oder keine Eigenschaften):
Wenn SimpleXMLElement mehr als eine Ebene tief ist, können Sie es zunächst in ein reines Array konvertieren:
Alte Antwort (einfaches Objekt) :
Wenn Sie überprüfen möchten, ob ein einfaches Objekt (Typ
stdClass
) vollständig leer ist (keine Schlüssel / Werte), können Sie Folgendes tun:Quelle: http://php.net/manual/en/language.oop5.object-comparison.php
Bearbeiten : Beispiel hinzugefügt
quelle
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()
ist speziell für Instanzen vonSimpleXMLElement
und nicht für Instanzen vonstdClass
. Ich glaube, all dies funktioniert immer noch in PHP7.2.Sie können Ihr Objekt in ein Array umwandeln und seine Anzahl folgendermaßen testen:
quelle
Stellen Sie sich vor, wenn das Objekt nicht leer und in gewisser Weise ziemlich groß ist, warum würden Sie die Ressourcen verschwenden, um es in ein Array umzuwandeln oder zu serialisieren ...
Dies ist eine sehr einfache Lösung, die ich in JavaScript verwende. Im Gegensatz zu der erwähnten Lösung, mit der ein Objekt in ein Array umgewandelt und überprüft wird, ob es leer ist, oder um es in JSON zu codieren, ist diese einfache Funktion in Bezug auf verwendete Ressourcen zur Ausführung einer einfachen Aufgabe sehr effizient.
Die Lösung funktioniert auf sehr einfache Weise: Sie tritt überhaupt nicht in eine foreach-Schleife ein, wenn das Objekt leer ist und zurückkehrt
true
. Wenn es nicht leer ist, tritt es in dieforeach
Schleife ein und kehrtfalse
sofort zurück, ohne den gesamten Satz zu durchlaufen.quelle
Die Verwendung
empty()
funktioniert nicht wie gewohnt, wenn sie für ein Objekt verwendet wird, da__isset()
stattdessen die Überladungsmethode aufgerufen wird, wenn sie deklariert ist.Daher können Sie verwenden
count()
(wenn das Objekt zählbar ist ).Oder indem Sie
get_object_vars()
zquelle
Eine weitere mögliche Lösung, für die kein Casting erforderlich ist
array
:quelle
Es gibt keine eindeutige sichere Methode, um zu überprüfen, ob ein Objekt leer ist
PHPs count () wird zuerst in ein Array umgewandelt, aber das Casting kann ein leeres Array erzeugen. Dies hängt davon ab, wie das Objekt implementiert ist (die Objekte von Erweiterungen sind häufig von diesen Problemen betroffen).
in deinem Fall musst du $ obj-> count () verwenden;
http://it.php.net/manual/en/simplexmlelement.count.php
(das ist nicht die Anzahl der PHPs http://www.php.net/count )
quelle
Wenn Sie etwas in PHP als (bool) umwandeln, erfahren Sie sofort, ob es sich bei dem Element um ein Objekt, einen primitiven Typ oder eine Null handelt. Verwenden Sie den folgenden Code:
quelle
Wenn ein Objekt "leer" ist oder nicht, ist dies eine Frage der Definition. Da dies von der Art des Objekts abhängt, das die Klasse darstellt, muss die Klasse es definieren.
PHP selbst betrachtet jede Instanz einer Klasse als nicht leer.
Es kann keine generische Definition für ein "leeres" Objekt geben. Sie könnten im obigen Beispiel argumentieren, dass das Ergebnis von
empty()
sein solltetrue
, da das Objekt keinen Inhalt darstellt. Aber woher soll PHP das wissen? Einige Objekte sollen niemals Inhalte darstellen (z. B. Think Factories), andere stellen immer einen sinnvollen Wert dar (Thinknew DateTime()
).Kurz gesagt, Sie müssen Ihre eigenen Kriterien für ein bestimmtes Objekt erstellen und diese entsprechend testen, entweder von außerhalb des Objekts oder von einer selbst geschriebenen
isEmpty()
Methode im Objekt.quelle
oder
quelle
Ich habe einen json_decode eines Strings in der Post-Anfrage verwendet. Keines der oben genannten hat bei mir funktioniert, am Ende habe ich Folgendes verwendet:
quelle