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


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
}

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

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
}

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.


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;

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 ) );

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 )


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!";
}

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.


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

oder

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}

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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.