Wie überprüfe ich, ob ein Objekt in PHP leer ist?

104

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);
Sandkasten
quelle
Mögliches Duplikat eines PHP-Objekts mit XML-Daten
Pekka
mögliches Duplikat von Wie prüfe ich, ob das Objekt in PHP leer ist?
Kenorb

Antworten:

130

Sie können in ein Array umwandeln und dann prüfen, ob es leer ist oder nicht

$arr = (array)$obj;
if (!$arr) {
    // do stuff
}
Peter Kelly
quelle
9
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
}

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
}


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 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
Timothy Zorn
quelle
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:

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

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.

stamat
quelle
8

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;
Kenorb
quelle
7

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 ) );
biziclop
quelle
2

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
1

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!";
}
Roosevelt
quelle
1
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.

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.

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

oder

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}
Muhammad Tahir
quelle
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
}
Frank Conry
quelle