获取对象层次结构中的特定值

时间:2012-12-13 00:19:15

标签: php amazon-web-services

我正在尝试从AWS响应中获取根类别名称。 ECS PHP类将其作为类返回。如果这是XML,我可以进行xpath搜索。我不知道搜索对象的等价物。

以下是从BrowseNode元素开始的对象结构:

object(stdClass)#172 (1) {
  ["BrowseNode"]=>
  object(stdClass)#173 (3) {
    ["BrowseNodeId"]=>
    string(8) "11059391"
    ["Name"]=>
    string(22) "Makeup Brushes & Tools"
    ["Ancestors"]=>
    object(stdClass)#174 (1) {
      ["BrowseNode"]=>
      object(stdClass)#175 (3) {
        ["BrowseNodeId"]=>
        string(8) "11062741"
        ["Name"]=>
        string(19) "Tools & Accessories"
        ["Ancestors"]=>
        object(stdClass)#176 (1) {
          ["BrowseNode"]=>
          object(stdClass)#177 (4) {
            ["BrowseNodeId"]=>
            string(8) "11055981"
            ["Name"]=>
            string(8) "Products"
            ["IsCategoryRoot"]=>
            bool(true)
            ["Ancestors"]=>
            object(stdClass)#178 (1) {
              ["BrowseNode"]=>
              object(stdClass)#179 (2) {
                ["BrowseNodeId"]=>
                string(7) "3760911"
                ["Name"]=>
                string(6) "Beauty"
              }
            }
          }
        }
      }
    }
  }
}

基本上,如果“IsCategoryRoot”为TRUE,我需要在下一个“Ancestors”元素下的“Name”中获取值。在这种情况下,“美丽”将是价值。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以轻松编写一个函数来递归到对象中并查找节点:

function find_category_root_name (stdClass $node) {
    if(isset($node->IsCategoryRoot) && $node->IsCategoryRoot === true) {
        if(isset($node->Ancestors->BrowseNode->Name) && !empty($node->Ancestors->BrowseNode->Name)) {
            return $node->Ancestors->BrowseNode->Name;
        } else {
            // error IsCategoryRoot found but no name found for ancestor
            return false;
        }
    } else if (isset($node->Ancestors->BrowseNode) && $node->Ancestors->BrowseNode instanceof stdClass) {
        return find_category_root_name($node->Ancestors->BrowseNode);
    } else {
        // error no ancestor node found
        return false;
    }
}

find_category_root_name($outer_object->BrowseNode);