2016-04-04 54 views
2

予加載某些XML產生SimpleXML對象像這樣(僅顯示一個對象)SimpleXML來陣列

SimpleXMLElement Object 
(
    [Jobs] => SimpleXMLElement Object 
    (
     [Job] => Array 
      (
       [0] => SimpleXMLElement Object 
       (
        [ID] => J000001 
        [Name] => Internal Time 
        [Description] => Use this job to record your internal and non-billable time for activities such as annual leave, sick leave, professional development, staff meetings etc 
        [Client] => SimpleXMLElement Object 
        (
         [ID] => 8430219 
         [Name] => Fake Client 
        ) 

        [ClientOrderNumber] => SimpleXMLElement Object 
        (
        ) 

        [State] => Planned 
        [StartDate] => 2016-03-21T00:00:00 
        [DueDate] => 2017-03-21T00:00:00 
        [InternalID] => 11442733 
        [Assigned] => SimpleXMLElement Object 
        (
         [Staff] => SimpleXMLElement Object 
          (
           [ID] => 344460 
           [Name] => Som Name 
          ) 
        ) 
       ) 
      ) 
    ) 
) 

我想做的是創建客戶端名稱和客戶端ID的數組。所以我瞄準的東西,像這樣

[data] => array (
    8430219 => Fake Client, 
    8430343 => Another Client, 
    etc 
) 

此刻,我可以在地方得到的名字,但與ID掙扎,因爲它說,這是一個非法偏移類型。這是我所擁有的

foreach($oXML->Jobs as $oEntry) { 
    foreach ($oEntry->Job as $data) { 
     $jobsArray = array(
      $data->Client->ID => $data->Client->Name 
     ); 
    } 
} 

如何基於SimpleXML對象創建數組?

感謝

+1

可能的複製[如何將XML轉換成PHP數組?( http://stackoverflow.com/questions/6578832/how-to-convert-xml-into-array-in-php) –

回答

1

首先,以獲得您想要的數組不能使用此語法:

$jobsArray = array($key => $val); 

你必須使用這樣的事情:

$jobsArray[$key] = $val; 

否則,在每個重複循環,你的語法將覆蓋先前的數組值。

然後,我建議您使用XPath來簡化整個過程。通過XPath查詢,您可以僅使用一個搜索來檢索一組節點。

假設你有這樣的XML:

<?xml version="1.0"?> 
<Jobs> 
    <Job> 
     <Client> 
      <ID>8430219</ID> 
      <Name>Fake Client</Name> 
     </Client> 
     <Client> 
      <ID>8430220</ID> 
      <Name>Fake Client 2</Name> 
     </Client> 
    </Job> 
    <Job> 
     <Client> 
      <ID>8430221</ID> 
      <Name>Fake Client 3</Name> 
     </Client> 
    </Job> 
</Jobs> 

有了這個XPath查詢:

$clients = $oXML->xpath('/Jobs/Job/Client'); 

$clients所有<Client>節點獲得。然後,你可以用這種方式創建數組:

$result = array(); 
foreach($clients as $client) 
{ 
    $result[$client->ID->__toString()] = $client->Name->__toString(); 
} 

$resultforeach循環:

Array 
(
    [8430219] => Fake Client 
    [8430220] => Fake Client 2 
    [8430221] => Fake Client 3 
) 

請注意,我們要投的字符串單節點(是的SimpleXML對象):這是絕對有必要創建密鑰,否則數組分配失敗。您可以使用(string) $client->ID代替$client->ID->__toString()