2010-11-03 7 views
0

Je suis en train d'échanger tous les attributs id à la fois de « $ vieux »> « $ nouveau » puis enregistrez le xml:boucle php ne fonctionne pas comme prévu

$reorder = array(9=>"8", 8=>"5", 7=>"4", 6=>"3", 5=>"0", 4=>"1", 3=>"9", 2=>"7", 1=>"2", 0=>"6"); 

    $objDOM = new SimpleXMLElement(some.xml, null, true); 
    foreach ($reorder as $old => $new) { 
     $picture = $objDOM->xpath('picture[@id="'.$old.'"]'); 
     $picture[0]["id"] = $new; 
    } 
    echo $objDOM->asXML(); 

Le résultat ci-dessous (ne correspond pas à matrice de réapprovisionnement $)

  • 3> 9
  • 9> 6
  • 8> 8
  • 7> 2
  • 6> 3
  • 5> 5
  • 4> 4
  • 0> 0
  • 1> 1
  • 7> 2

Il semble commuter les identifiants dans l'ordre, Les identifiants qui viennent d'être changés sont alors commutés à nouveau s'ils apparaissent plus tard dans le tableau.

Qu'est-ce que je fais mal là-bas? Comment puis-je l'obtenir pour changer tous les ID en une seule fois?

Merci ... Andy

+0

Avez-vous omis quelque chose dans le code que vous avez collé? – tplaner

Répondre

2

La réponse sont deux boucles

poing vous recherchez le XPath pour l'ancien id, le stocker dans un tableau puis à nouveau en boucle pour remplacer les résultats stockés avec le nouvelle id

$reorder = array(9 => "8", 8 => "5", 7 => "4", 6 => "3", 5 => "0", 4 => "1", 3 => "9", 2 => "7", 1 => "2", 0 => "6"); 

$objDOM = new SimpleXMLElement(
     '<pictures> 
    <picture id="9">id was 9, should be 8 now</picture> 
    <picture id="8">id was 8, should be 5 now</picture> 
    <picture id="7">id was 7, should be 4 now</picture> 
    <picture id="6">id was 6, should be 3 now</picture> 
    <picture id="5">id was 5, should be 0 now</picture> 
    <picture id="4">id was 4, should be 1 now</picture> 
    <picture id="3">id was 3, should be 9 now</picture> 
    <picture id="2">id was 2, should be 7 now</picture> 
    <picture id="1">id was 1, should be 2 now</picture> 
    <picture id="0">id was 0, should be 6 now</picture> 
</pictures>'); 
$oldPicIds = array(); 

foreach ($reorder as $old => $new) { 
    $oldPicIds[$old] = $objDOM->xpath('picture[@id="' . $old . '"]'); 
} 

foreach ($reorder as $old => $new) { 
    $oldPicIds[$old][0]['id'] = $new; 
} 

echo $objDOM->asXML(); 

sortie:

<?xml version="1.0"?> 
<pictures> 
    <picture id="8">id was 9, should be 8 now</picture> 
    <picture id="5">id was 8, should be 5 now</picture> 
    <picture id="4">id was 7, should be 4 now</picture> 
    <picture id="3">id was 6, should be 3 now</picture> 
    <picture id="0">id was 5, should be 0 now</picture> 
    <picture id="1">id was 4, should be 1 now</picture> 
    <picture id="9">id was 3, should be 9 now</picture> 
    <picture id="7">id was 2, should be 7 now</picture> 
    <picture id="2">id was 1, should be 2 now</picture> 
    <picture id="6">id was 0, should be 6 now</picture> 
</pictures> 

pour enregistrer un tableau, vous pouvez utiliser array_pop pour obtenir la dernière occurrence de picture @ id = xy. qui devrait être celui recherché (lire les commentaires des inconvénients)

$reorder = array(9 => "8", 8 => "5", 7 => "4", 6 => "3", 5 => "0", 4 => "1", 3 => "9", 2 => "7", 1 => "2", 0 => "6"); 

$objDOM = new SimpleXMLElement(
     '<pictures>...</pictures>'); 

foreach ($reorder as $old => $new) { 
    $picture = $objDOM->xpath('picture[@id="' . $old . '"]'); 
    $picture = array_pop($picture); 
    $picture['id'] = $new; 
} 

echo $objDOM->asXML(); 
+0

brillant! (Je voterais votre réponse mais je n'ai pas assez de points pour le moment) Une explication simple aussi, merci beaucoup maggie. – Andy

+0

c'est ok. ce que j'ai oublié de mentionner: la solution 'array_pop' est seulement quelque chose pour l'occurrence d'un attribut unique et bien sûr triée. si vous changez les positions d'origine de p.e 9 et 8, la solution 'array_pop' échouera – teemitzitrone

0

A en juger par l'exemple contenu dans la question, je voudrais simplement parcourir tous <picture/> éléments et changer @id en conséquence. Par exemple:

foreach ($objDOM->picture as $picture) 
{ 
    $id = (string) $picture['id']; 
    $picture['id'] = $reorder[$id]; 
} 

Cela suppose que $reorder a une entrée pour chaque @id utilisé dans le document. Sinon, vous devrez utiliser isset() pour ignorer les nœuds qui n'ont pas besoin d'être modifiés.

Questions connexes