PHP:如何在“foreach”循环之前按属性按字母顺序对 XML 进行排序

ame*_*ich 2 php xml xml-parsing

设置:

我有一个我无法控制的外部 XML 文件,如下:

001.xml

<?xml version="1.0" encoding="utf-8"?>
<Gallery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="001" Name="001">
<Images>
<ImageGalleryEntry Name="1 John" Description="Doe" FileName="830358.1john.png" Width="100" Height="100">
<S3Key>accounts/b2d174c1-a408-4d58-9d48-1490ac4e9f9b/site-37857/cms-assets/images/830358.logooraclehealthsciencesthumb.png</S3Key>
<S3ThumbnailKey>accounts/b2d174c1-a408-4d58-9d48-1490ac4e9f9b/site-37857/cms-assets/thumbnails/830358.logooraclehealthsciencesthumb.png</S3ThumbnailKey>
<ContentLength>1309</ContentLength>
</ImageGalleryEntry>
<ImageGalleryEntry Name="11 Jane" Description="Doet" FileName="943702.11jane.png" Width="100" Height="100">
<S3Key>accounts/b2d174c1-a408-4d58-9d48-1490ac4e9f9b/site-37857/cms-assets/images/943702.logorochethumb.png</S3Key>
<S3ThumbnailKey>accounts/b2d174c1-a408-4d58-9d48-1490ac4e9f9b/site-37857/cms-assets/thumbnails/943702.logorochethumb.png</S3ThumbnailKey>
<ContentLength>1403</ContentLength>
</ImageGalleryEntry>
<ImageGalleryEntry Name="10 Jack" Description="Smith" FileName="965501.10jack.png" Width="100" Height="100">
<S3Key>accounts/b2d174c1-a408-4d58-9d48-1490ac4e9f9b/site-37857/cms-assets/images/965501.pwclogo.png</S3Key>
<S3ThumbnailKey>accounts/b2d174c1-a408-4d58-9d48-1490ac4e9f9b/site-37857/cms-assets/thumbnails/965501.pwclogo.png</S3ThumbnailKey>
<ContentLength>7021</ContentLength>
</ImageGalleryEntry>
</Images>
</Gallery>
Run Code Online (Sandbox Code Playgroud)

我还有一个 php 代码,它获取此信息并将其很好地放在 html 中:

index.php 片段

<?php
$url = '001.XML';
$xml = simplexml_load_file($url);
foreach($xml->Images->ImageGalleryEntry as $item) {
    echo $item['FileName'] . "<br/>" . $item['Name'] . "<br/>" . $item['Description'] . "<br/><br/>";
};
?>
Run Code Online (Sandbox Code Playgroud)

输出是:

830358.1john.png
1 约翰
·多伊

943702.11jane.png
11
简·多特

965501.10jack.png
10 杰克·
史密斯

问题是我实际上需要按 Name 属性排序,如下所示:

830358.1john.png
1 约翰
·多伊

965501.10jack.png
10 杰克
·史密斯

943702.11jane.png
11
简·多特

请注意,XML 不断变化,因此 php 应自动按名称的字母顺序对它们进行排序。我猜想在进入 foreach 循环之前我需要以某种方式按名称属性按字母顺序对所有 ImageGalleryEntry 标签进行排序,但不知道如何做到这一点。

请提供一个实际的方法来做到这一点,我是 php 的新手,如果你说“创建一个数组”之类的东西,我不知道该怎么做。

Jan*_*nci 5

您需要使用usort。这应该有效:

<?php
$url = '001.XML';
$xml = simplexml_load_file($url);

$items = array();
foreach($xml->Images->ImageGalleryEntry as $item) {
    $items[] = $item;
};

// Custom sort on the names of the items:
usort ($items, function($a, $b) {
    return strcmp($a['Name'], $b['Name']);
});

foreach ($items as $item) {
    echo $item['FileName'] . "<br/>" . $item['Name'] . "<br/>" . $item['Description'] . "<br/><br/>";
}
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因,当我使用它时,$items 变成了 simplexml 对象的数组,然后,usort 从未工作。我想我必须从 $a['Name'] 更改为 $a-&gt;Name 并在 foreach 上执行相同的操作,然后它就起作用了。 (3认同)