PHP: Как отсортировать XML в алфавитном порядке по атрибуту перед циклом «для каждого» - PullRequest
1 голос
/ 01 марта 2012

Настройка:

У меня есть внешний файл 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>

У меня также есть 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/>";
};
?>

Вывод:

830358.1john.png
1 Джон
Doe

943702.11jane.png
11 Джейн
DOET

965501.10jack.png
10 Джек
Smith

Проблема в том, что мне нужно, чтобы он был упорядочен по атрибуту Name, например:

830358.1john.png
1 Джон
Doe

965501.10jack.png
10 Джек
Смит

943702.11jane.png
11 Джейн
DOET

Обратите внимание, что XML постоянно меняется, поэтому php должен автоматически упорядочить их в алфавитном порядке по имени. Я предполагаю, что мне нужно каким-то образом отсортировать по алфавиту все теги ImageGalleryEntry по их атрибуту Name перед вводом для каждого цикла, но не знаю, как это сделать.

Пожалуйста, предоставьте реальный способ сделать это, я новичок в php, и не буду знать, что делать, если вы скажете что-то вроде «сделать массив».

1 Ответ

4 голосов
/ 01 марта 2012

Вам нужно использовать 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/>";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...