2016-11-23 3 views
0

Ich habe eine XML, die viele Tausende von Knoten mit Informationen über sie in Attributen enthält. Jeder Knoten ist, wie:XML-Attribute für Arrays (PHP)

<Class Option1="fiahfs;if" Option2="fiowfr0r0" ClassID="1"> 
<Class Option1="ro;ewaj;frwajro" Option2="afj;wh;fha" Option3="34014upkla" ClassID="2"> 
.... 

I, dass Informationen in PHP-Arrays mit Array-Namen zu analysieren, müssen Attributnamen zu sein, und die Anzahl von Element-Array in gleich ClassID Attribute. Das Problem ist, dass einige Knoten Attribute haben, die andere Knoten ich nicht habe. Früher habe ich vorher -> Attribute() für ein ausgewähltes Element als

$a => $b, $$a=array();

dann

${$a}[(integer)$products['ClassID']]=$b 

Wo Produkte $ ist simplexml Element bekam von Parsen von XML mit XPath. Das gab mir im Grunde, was ich brauchte - ich hatte ein paar Arrays und ich konnte meine Anfragen wie $ Option1 [1], $ Option2 [1], Option1 [2] ... etc.

Aber das Problem ist, dass, wenn ich diese Struktur nur mithilfe der Attributliste eines ausgewählten Elements erstellen -Es gibt Elemente, die dieses eine Element nicht haben, aber andere haben, und nach einem Array erstellen und dann XML analysieren - Es wird keine Arrays geben. Wenn ich zum Beispiel Arrays aus [0] dieses Beispiels erzeuge, erhält ich $ Option1, $ Option2, aber keine $ Option3.

Wenn ich meinen Code wieder aufgebaut:

foreach ($XML->xpath('/idspace/Class') as $products){ 
foreach($products->attributes() as $a => $b){ 
if(!isset($$a) $$a=array(); 
${$a}[(integer)$products['ClassID']]=$b; 
}} 

Und danach habe ich ($ ClassID) zu foreach versuchte - `ve bekam nur ein Element in diesem Array. Wie kann ich jedes XML-Attribut zu Array analysieren, während das Attribut "ClassID" als Elementnummer im Array verwendet wird?

+0

'$ XmlElement-> Kinder();' ' – Bobot

+0

$ {a $} [(integer) $ Artikel [ 'ClassID']] [] = $ b'? –

Antwort

0

Ich bin ziemlich verwirrt mit Ihren Arrays. Für mich klingt es seltsam, für jedes Attribut ein zusätzliches Array zu haben. Warum nicht ein Array erstellen, das jedes Element enthält und die Attribute als untergeordnete Elemente hat? So dass am Ende ein Array wie diese:

$products = array(
    [1] => array(
     [Option1] => "fiahfs;if", 
     [Option2] => "fiowfr0r0", 
    ), 
    [2] => array(
     [Option1] => "ro;ewaj;frwajro", 
     [Option2] => "afj;wh;fha", 
     [Option3] => "34014upkla", 
    ), 

Auf diese Weise können Sie leicht alle Attribute für einen bestimmten childID zugreifen: $ Artikel [$ childID] [ ‚Option1‘] - oder besser Check wenn der Attributname existiert.

Sie können simplexml- verwenden> Attribute()

$products = array(); // products will have the result! 
foreach ($xml->products as $productXml) { // don't know your xml structure here, 
              // but you need to iterate over every product in the xml 
    $singleProduct = array(); 
    $classId = 0; 
    foreach($productXml->attributes() as $a => $b) { 
     if ($a == 'ClassID') { 
      $classId = $b; 
     } else { 
      $singleProduct[$a] = $b; 
     } 
    } 
    $products[$classId] = $singleProduct; 
} 
+0

Ja, ich weiß, dass es eine seltsame Struktur hat. Ich möchte einfach nicht Tausende von Strings mit diesen Adressen durch das ganze existierende Projekt ändern. Wie auch immer, danke. Verwenden Sie wahrscheinlich diese Methode und Adressen manuell ändern. –

+0

Wenn Sie die Struktur benötigen, müssen Sie alle Produkte einmal iterieren -> um alle vorhandenen Attribute herauszufinden. Dann erstellen Sie die Arrays. Wiederholen Sie dann alle Produkte erneut und füllen Sie ALLE Attributfelder mit Daten für jedes Produkt (ClassID). Sie müssen herausfinden, was Sie als Nullwert für einen nicht vorhandenen Attributwert für dieses Produkt verwenden können. – Seb