Подтвердить что ты не робот

Проверка php stdClass для свойства существует

Я прочитал некоторые подобные проблемы здесь, но, к сожалению, нашел решение для моего случая.

Некоторая часть вывода для соединения API выглядит так:

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 )

Некоторые строки не включают свойство gpps.

Я сделал следующее:

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

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

Я хочу, чтобы свойство gpps не включалось в эту строку $subId, хранящейся как 0-0 в db, иначе получите данные из строки. Но он не получает строки без gpps.

Где моя ошибка?

4b9b3361

Ответ 1

Изменить

if(property_exists($sale, gpps)) 

с

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

Обратите внимание, как теперь gpps передается как строка, в соответствии с спецификациями функции property_exists:

bool property_exists ( mixed $class , string $property )

Эта функция проверяет, существует ли данное свойство в указанном классе.

Примечание:В отличие от isset(), property_exists() возвращает TRUE, даже если свойство имеет значение NULL.

Ответ 2

property_exists - это метод, разработанный для этой цели.

bool property_exists (смешанный $class, string $property)

Эта функция проверяет, существует ли данное свойство в указанном классе.

Заметка: В противоположность isset() свойство_exists() возвращает TRUE, даже если свойство имеет значение NULL.

Ответ 3

Попробуйте простой взлом и используйте count, так как свойство содержит массив, и я полагаю, что count (array) == 0 - это тот же случай, когда свойство не установлено.

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

Конечно, это не самое красивое решение, но поскольку php-функция работает не так, как ожидалось, я подумал немного более прагматично.

Ответ 4

Другой способ: 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";
    }
    }
}