So finden Sie heraus, ob ein Objekt in PHP leer ist oder nicht.
Es folgt der Code, in dem $objXML-Daten gespeichert sind. Wie kann ich überprüfen, ob es leer ist oder nicht?
Mein Code:
$obj = simplexml_load_file($url);
So finden Sie heraus, ob ein Objekt in PHP leer ist oder nicht.
Es folgt der Code, in dem $objXML-Daten gespeichert sind. Wie kann ich überprüfen, ob es leer ist oder nicht?
Mein Code:
$obj = simplexml_load_file($url);
Antworten:
Sie können in ein Array umwandeln und dann prüfen, ob es leer ist oder nicht
$arr = (array)$obj;
if (!$arr) {
// do stuff
}
empty($var)äquivalent (!isset($var) || !$var). Sie können Ihre empty($arr)s durch !$arrseitarray() == FALSE
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.
Bearbeiten : Ich wusste nicht, dass sie speziell prüfen wollten, ob ein SimpleXMLElement-Objekt leer ist. Ich habe die alte Antwort unten hinterlassen
Für SimpleXMLElement:
Wenn mit leer gemeint ist, hat keine Eigenschaften:
$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
// no properties
}
ODER
$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
// empty array
}
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
}
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 empty
if ( $obj == new stdClass() )
{
echo "Object is empty"; // JSON: {}
}
else
{
echo "Object has properties";
}
Quelle: http://php.net/manual/en/language.oop5.object-comparison.php
Bearbeiten : Beispiel hinzugefügt
$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
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()ist speziell für Instanzen von SimpleXMLElementund nicht für Instanzen von stdClass. 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:
if(count((array)$obj)) {
// doStuff
}
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 ).
Oder indem Sie get_object_vars()z
get_object_vars($obj) ? TRUE : FALSE;
Eine weitere mögliche Lösung, für die kein Casting erforderlich ist 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 ) );
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 )
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!";
}
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.
class Test { }
$t = new Test();
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.
$array = array_filter($array);
if(!empty($array)) {
echo "not empty";
}
oder
if(count($array) > 0) {
echo 'Error';
} else {
echo 'No Error';
}
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
}