搜索嵌套对象的属性

时间:2017-01-31 10:55:38

标签: php

我有一个从API返回的对象,我需要查看属性是否存在。问题是属性可能是其他对象,每个对象都需要被搜索。

这可能是通过递归解决的,但我无法理解它或我的代码示例。

我很惊讶我无法找到这个在线解决方案,所以在这里发布专家建议。

这是一个对象的例子,我需要确保" LowestNewPrice"存在并返回值

stdClass Object
(
    [OperationRequest] => stdClass Object
        (
            [HTTPHeaders] => stdClass Object
                (
                    [Header] => stdClass Object
                        (
                            [Name] => UserAgent
                            [Value] => PHP-SOAP/5.6.2
                        )

                )

            [RequestId] => 20bd3916-3d92-4519-b3be-c80c7cf16b1b
            [Arguments] => stdClass Object
                (
                    [Argument] => stdClass Object
                        (
                            [Name] => Service
                            [Value] => AWSECommerceService
                        )

                )

            [RequestProcessingTime] => 0.005986476
        )

    [Items] => stdClass Object
        (
            [Request] => stdClass Object
                (
                    [IsValid] => True
                    [ItemLookupRequest] => stdClass Object
                        (
                            [IdType] => ASIN
                            [ItemId] => 1405278269
                            [ResponseGroup] => OfferSummary
                            [VariationPage] => All
                        )

                )

            [Item] => stdClass Object
                (
                    [ASIN] => 1405278269
                    [OfferSummary] => stdClass Object
                        (
                            [LowestNewPrice] => stdClass Object
                                (
                                    [Amount] => 44
                                    [CurrencyCode] => GBP
                                    [FormattedPrice] => £0.44
                                )

                            [LowestUsedPrice] => stdClass Object
                                (
                                    [Amount] => 1
                                    [CurrencyCode] => GBP
                                    [FormattedPrice] => £0.01
                                )

                            [TotalNew] => 30
                            [TotalUsed] => 12
                            [TotalCollectible] => 0
                            [TotalRefurbished] => 0
                        )

                )

        )

)

4 个答案:

答案 0 :(得分:2)

我的解决方案:

  1. 将此对象转换为json string
  2. 使用strpos检查密钥是否存在,如果您只需检查密钥是否存在,或使用preg_match()搜索对key=>value

答案 1 :(得分:1)

由于它总是在同一个地方我会使用这个

/* CSS */

html, body {
    margin: 0;
    padding: 0;
    overflow: hidden;
}

#home {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    min-height: 100vh;
    margin: 0;
    z-index: 9;
    display: block;
    background-color: #1abc9c;
}

#page1 {
    position: absolute;
    top: 0;
    left: 100vw;
    width: 100%;
    min-height: 100vh;
    margin: 0;
    display: block;
    z-index: 99;
    background-color: #2ecc71;
}

#page2 {
    position: absolute;
    top: 100vh;
    left: 0;
    width: 100%;
    min-height: 100%;
    margin: 0;
    display: block;
    background-color: #3498db;
}

.moveleft {
     transform:translate(-100vw, 0);
     -moz-transform:translate(-100vw, 0);
     -ms-transform:translate(-100vw, 0);
     -webkit-transform:translate(-100vw, 0);
     -o-transform:translate(-100vw, 0);
     transition: transform 700ms;
     -webkit-transition-timing-function: ease-in;
     transition-timing-function: cubic-bezier(.86,.01,.77,.78);
     -webkit-transition-delay: 200ms;
     transition-delay: 200ms;
}

.movecenter {
     transform: translate(0, 0);
     -moz-transform: translate(0, 0);
     -ms-transform: translate(0, 0);
     -webkit-transform: translate(0, 0);
     -o-transform: translate(0, 0);
     transition: transform 700ms;
     -webkit-transition-timing-function: ease-in;
     transition-timing-function: cubic-bezier(.86,.01,.77,.78);
     -webkit-transition-delay: 200ms;
     transition-delay: 200ms;
}

.moveup {
    transform: translate(0, -100vh);
    -moz-transform: translate(0, -100vh);
    -ms-transform: translate(0, -100vh);
    -webkit-transform: translate(0, -100vh);
    -o-transform: translate(0, -100vh);
    transition: transform 700ms;
    -webkit-transition-timing-function: ease-in;
    transition-timing-function: cubic-bezier(.86,.01,.77,.78);
    -webkit-transition-delay: 200ms;
    transition-delay: 200ms;
}

.movedown {
    transform: translate(0, 0);
    -moz-transform: translate(0, 0);
    -ms-transform: translate(0, 0);
    -webkit-transform: translate(0, 0);
    -o-transform: translate(0, 0);
    transition: transform 700ms;
    -webkit-transition-timing-function: ease-in;
    transition-timing-function: cubic-bezier(.86,.01,.77,.78);
    -webkit-transition-delay: 200ms;
    transition-delay: 200ms;
}

答案 2 :(得分:0)

罗马的一种方式..

$findInObject = function($obj,$property) use (&$findInObject){
    if(is_object($obj)){
        $obvar = get_object_vars($obj);
        if(array_key_exists($property,$obvar)){
            return $obvar[$property];
        } else {
            foreach($obvar as $var){
                $result =  $findInObject($var,$property);
                if($result){
                    return $result;
                }
            }
        }
    }
    return null;
};

$obj = new stdClass();
$obj->MyProp1 = new stdClass();
$obj->MyProp1b = new stdClass();
$obj->MyProp1->MyProp2 = 'myresult';
$obj->MyProp1->MyProp2b = 'myresultb';


print_r($findInObject($obj,'MyProp2'));//Result: myresult
print_r($findInObject($obj,'MyProp2b'));//Result: myresultb
//OR 
print_r($findInObject($obj->MyProp1,'MyProp2b'));//Result: myresultb

答案 3 :(得分:0)

您可以使用isset检查对象属性:

if(isset($response->Items->Item->OfferSummary->LowestNewPrice)) {
    // LowestNewPrice exists
} else {
    // Doesn't exist or one of the properties doesn't exist
}

这样,您无需单独检查每个属性。

相关问题