php stdClass-Prüfung auf Eigenschaft existiert

Lesezeit: 3 Minuten

Benutzer-Avatar
juni8

Ich habe hier einige ähnliche Probleme gelesen, finde aber leider die Lösung für meinen Fall.

Ein Teil der Ausgabe für eine API-Verbindung ist wie folgt:

stdClass Object (
    [page] => 0
    [items] => 5
    [total] => 5
    [saleItems] => stdClass Object (
        [saleItem] => Array (
            [0] => stdClass Object (
                [reviewState] => approved
                [trackingDate] => 2013-11-04T09:51:13.420+01:00
                [modifiedDate] => 2013-12-03T15:06:39.240+01:00
                [clickDate] => 2013-11-04T09:06:19.403+01:00
                [adspace] => stdClass Object (
                    [_] => xxxxx
                    [id] => 1849681 
                )
                [admedium] => stdClass Object (
                    [_] => Version 3
                    [id] => 721152
                )
                [program] => stdClass Object (
                    [_] => yyyy
                    [id] => 10853
                )
                [clickId] => 1832355435760747520
                [clickInId] => 0
                [amount] => 48.31
                [commission] => 7.25
                [currency] => USD
                [gpps] => stdClass Object (
                    [gpp] => Array (
                        [0] => stdClass Object (
                            [_] => 7-75
                            [id] => z0
                        )
                    )
                )
                [trackingCategory] => stdClass Object (
                    [_] => rers
                    [id] => 68722
                )
                [id] => 86erereress-a9e4-4226-8417-a46b4c9fd5df
            )
        )
    )
)

Einige Zeichenfolgen enthalten keine gpps-Eigenschaft.

Was ich getan habe, ist wie folgt

foreach($sales->saleItems->saleItem as $sale)
{
    $status     = $sale->reviewState;
    
    if(property_exists($sale, gpps)) 
    {
        $subId      = $sale->gpps->gpp[0]->_;
    }else{
        $subId      = "0-0";
    }
}

Was ich will, ist, dass die gpps-Eigenschaft nicht in dieser Zeichenfolge enthalten ist $ subId gespeichert als 0-0 in db, andernfalls die Daten aus der Zeichenfolge abrufen. Aber es bekommt die Saiten nicht ohne gpps.

Wo ist mein Fehler?

  • versuchen zu benutzen isset($sale->gpps)

    – Ilja Bursov

    4. Dezember 2013 um 20:53 Uhr


  • das bedeutet, dass Sie es falsch verwendet haben, verwenden isset und vielleicht empty um die Situation zu überprüfen, wenn die Eigenschaft festgelegt ist, aber keine Elemente hat

    – Ilja Bursov

    4. Dezember 2013 um 20:58 Uhr


  • versuche property_exists($sale, ‘gpps’)

    – Quellbrune

    4. Dezember 2013 um 21:06 Uhr

  • @june8 Wenn Isset nicht funktioniert hat, müssen Sie es falsch verwenden.

    – Chiffre

    4. Dezember 2013 um 21:10 Uhr

  • Wenn ich isset($sale->gpps) oder property_exists($sale, ‘gpps’) verwende, ändere ich nur diesen Teil meines Codes, den ich oben geschrieben habe. Stimmt etwas mit dem Rest des Codes nicht? Denn keiner von ihnen funktioniert

    – juni8

    4. Dezember 2013 um 21:14 Uhr

Benutzer-Avatar
Matteo Tassinari

Veränderung

if(property_exists($sale, gpps)) 

mit

if(property_exists($sale, "gpps"))

merke wie jetzt gpps wird gemäß der Signatur der als String übergeben property_exists Funktion:

bool property_exists ( mixed $class , string $property )

Diese Funktion prüft, ob die angegebene Eigenschaft in der angegebenen Klasse vorhanden ist.

Notiz:
Im Gegensatz zu isset(), property_exists() kehrt zurück TRUE auch wenn die Immobilie den Wert hat NULL.

Eigenschaft_existiert ist die Methode, die für diesen Zweck entwickelt wurde.

bool property_exists ( gemischte $class , string $property )

Diese Funktion prüft, ob die angegebene Eigenschaft in der angegebenen Klasse vorhanden ist.

Hinweis: Im Gegensatz zu isset() gibt property_exists() auch dann TRUE zurück, wenn die Eigenschaft den Wert NULL hat.

Versuchen Sie einen einfachen Hack und verwenden Sie count, da die Eigenschaft ein Array enthält, und ich denke, dass count(array) == 0 derselbe Fall ist, als wenn die Eigenschaft nicht festgelegt ist.

foreach($sales->saleItems->saleItem as $sale)
{
 $status     = $sale->reviewState;

 if(@count($sale->gpps->gpp) && count($sale->gpps->gpp) > 0) 
 {
    $subId      = $sale->gpps->gpp[0]->_;
 }else{
    $subId      = "0-0";
 }
}

Sicher, das ist nicht die schönste Lösung, aber da die php-Funktion nicht wie erwartet funktioniert, dachte ich etwas pragmatischer.

Ein anderer Weg , get_object_vars

$obj = new stdClass();
$obj->name = "Nick";
$obj->surname = "Doe";
$obj->age = 20;
$obj->adresse = null;

$ar_properties[]=get_object_vars($obj);

foreach($ar_properties as $ar){
    foreach ($ar as $k=>$v){        
    if($k =="surname"){
        echo "Found";
    }
    }
}

1299960cookie-checkphp stdClass-Prüfung auf Eigenschaft existiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy