2012-12-13 45 views
0

我試圖從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」是真的,我需要得到在「名稱」的值下一個「祖先」元素。在這種情況下,「美」就是價值。

我該怎麼做?

回答

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

看上去就像這將是要走的路。希望只有一種簡單的對象搜索方法,我錯過了PHP文檔中的某處......或者將AWS SOAP響應轉換爲XML可搜索結構的方式。 – eComEvo

+0

你當然可以使用反射或基本'property_exists()'調用的方法,但這裏的主要問題是你有嵌套的對象,所以你需要遞歸。我的猜測是,這個對象在某個時候是通過json_decode運行的JSON響應(基於它是所有的stdClass對象),所以一種可能的替代方法是對其執行「json_encode」並執行正則表達式搜索或者一系列常規字符串搜索)從字符串中提取您正在查找的值。儘管這對我來說似乎有點不好。 –

+0

我必須同意。將堅持遞歸搜索。感謝您的建議! :) – eComEvo