我正在尝试从'$ old'>一次交换所有属性ID '$ new'然后保存xml:
$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();
以下结果(与Array $ reorder不匹配)
它似乎是按顺序切换id,所以刚刚切换的id然后再次切换,如果它们稍后出现在数组中。
那里我做错了什么?如何让它一次性切换所有id?
...谢谢 安迪
答案 0 :(得分:2)
答案是两个循环
首先在xpath中搜索旧id,将其存储在数组中 然后再次循环以使用新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();
输出:
<?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>
要保存数组,您可以使用array_pop
来获取最后一次出现的图片@ id = xy。
哪个应该是想要的那个(阅读缺点评论)
$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();
答案 1 :(得分:0)
从问题中包含的示例来看,我只是迭代所有<picture/>
个元素并相应地更改@id
。例如:
foreach ($objDOM->picture as $picture)
{
$id = (string) $picture['id'];
$picture['id'] = $reorder[$id];
}
这假设$reorder
在文档中使用的每个@id
都有一个条目。否则,您需要使用isset()
来跳过不需要更改的节点。