如何在 PHP 中的重复子节点上选择和排序 XML


How to select and sort XML on repeating child node in PHP

我有一个关于绘画数据的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