我有一个关于绘画数据的XML文件。每幅画可以属于一个或多个画廊。我需要能够按画廊选择画作,然后将该列表按位置顺序排序。因此,例如,我有如下XML:
<Paintings>
<Painting>
<Title>Painting 1</Title>
<Description>ABC</Description>
<Galleries>
<Gallery id="01">1</Gallery>
<Gallery id="02">3</Gallery>
</Galleries>
<Picturefile>painting1</Picturefile>
</Painting>
<Painting>
<Title>Painting 2</Title>
<Description>DEF</Description>
<Galleries>
<Gallery id="02">2</Gallery>
<Gallery id="03">2</Gallery>
</Galleries>
<Picturefile>painting2</Picturefile>
</Painting>
<Painting>
<Title>Painting 3</Title>
<Description>GHI</Description>
<Galleries>
<Gallery id="01">2</Gallery>
<Gallery id="03">1</Gallery>
</Galleries>
<Picturefile>painting3</Picturefile>
</Painting>
<Painting>
<Title>Painting 4</Title>
<Description>JKL</Description>
<Galleries>
<Gallery id="02">1</Gallery>
<Gallery id="03">3</Gallery>
</Galleries>
<Picturefile>painting4</Picturefile>
</Painting>
</Paintings>
例如,我需要在画廊"02"中选择画作,然后将它们按位置顺序排序。在上面的 xml 中,节点值代表该库的排序顺序。对于选择,我会使用:
$gallerypics = ($paintings->xpath("Painting/Galleries/Gallery[@id='$galleryid']"));
在这一点上,我被困住了。 然后,如何根据该特定库的节点值对$gallerypics进行排序?我可以选择使排序顺序成为属性而不是值,但我仍然坚持如何对其进行排序。如果每幅画只有一个画廊节点,这是不费吹灰之力的。 我被困在如何使用多个图库节点执行此操作上。 任何意见都非常感谢。
基本思想只是选择你想要的画作,将它们转储到一个数组中,然后根据你的标准对其进行排序。
<小时 />例:
//$xml = your xml string
$galleryid = '02';
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$paintings = iterator_to_array($xpath->query("/Paintings/Painting[Galleries/Gallery/@id='$galleryid']"));
usort(
$paintings,
function ($a, $b) use ($xpath, $galleryid) {
$query = "number(Galleries/Gallery[@id='$galleryid'])";
return $xpath->evaluate($query, $a) - $xpath->evaluate($query, $b);
}
);
foreach ($paintings as $painting) {
echo $xpath->evaluate('string(Title)', $painting), "'n";
}
<小时 />输出:
Painting 4
Painting 2
Painting 1