2016-04-04 5 views
2

ich einige XML laden, die wie so ein SimpleXML Objekt erzeugt (nur ein Objekt angezeigt wird)SimpleXML zu Array

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 
          ) 
        ) 
       ) 
      ) 
    ) 
) 

Was ich möchte, ist zu tun, ein Array des Kunden Name und Client-ID zu erstellen. So denn ich bin mit dem Ziel etwas wie so

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

Im Moment kann ich den Namen in Platz bekommen, aber mit der ID zu kämpfen, weil sie sagt, es ist ein illegaler Offset-Typ. Dies ist, was ich

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

haben Wie kann ich das Array auf dem SimpleXML Objekt basiert ich habe?

Dank

+1

Mögliche Duplikat von [Wie xml in Array in PHP konvertieren?] (http://stackoverflow.com/questions/6578832/how-to-convert-xml-into-array-in-php) –

Antwort

1

Zunächst einmal die gewünschte Array zu erhalten, Sie nicht diese Syntax verwenden:

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

Sie haben etwas zu verwenden:

$jobsArray[$key] = $val; 

, sonst bei Bei jeder wiederholten Schleife überschreibt Ihre Syntax die vorherigen Array-Werte.

Dann schlage ich vor, Sie verwenden XPath, um den gesamten Prozess zu vereinfachen. Mit XPath-Abfragen können Sie eine Gruppe von Knoten mit nur einer Suche abrufen.

Sie haben Angenommen, diese 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> 

Mit dieser XPath-Abfrage:

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

Sie in $clients alle <Client> Knoten erhalten. Dann können Sie Ihre Array auf diese Weise erstellen:

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

Dies wird $result nach foreach Schleife:

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

Bitte beachte, dass wir als String einzelne Knoten werfen müssen (die SimpleXML Objekte sind): Dies ist unbedingt notwendige Schlüsselerstellung, sonst schlägt die Array-Zuweisung fehl. Sie können gleiche Ergebnis mit (string) $client->ID statt $client->ID->__toString() erhalten