У меня есть XML, скажем:
<Backgrounds> <Background> <Uses>14</Uses> </Background> <Background> <Uses>19</Uses> </Background> <Background> <Uses>3</Uses> </Background> </Backgrounds>
Как я могу сортировать XML с самого низкого Uses
до самого высокого?
Кроме того, как я мог просто получить дно 2 Background
s или те, которые были недавно добавлены?
Как я могу сортировать XML с самого низкого
Uses
до самого высокого?
Чтобы отсортировать список элементов с самого низкого до самого высокого, вам нужно создать массив этих элементов, а затем отсортировать этот массив. Выражение xpath может использоваться для получения как массива элементов, подлежащих сортировке, так и данных, которые отсортированы по массиву (sort-key).
Когда ваши XML и дети Uses
значение сортировки, он работает следующим образом:
$elements = $xml->xpath('/*/Background'); $sortKeys = $xml->xpath('/*/Background/Uses'); array_multisort($sortKeys, SORT_NUMERIC, SORT_ASC, $elements); foreach($elements as $i => $element) { echo $i, ' ', $element->asXML(), "\n"; }
Результат:
0 <Background> <Uses>14</Uses> </Background> 1 <Background> <Uses>19</Uses> </Background> 2 <Background> <Uses>3</Uses> </Background>
См. array_multisort()
и «Как отсортировать многомерный массив в php» .
Кроме того, как я мог просто получить дно 2
Background
s или те, которые были недавно добавлены?
Это можно сделать только с xpath:
$bottomTwo = $xml->xpath('/*/Background[position() > count(/*/Background) - 2]');
И если последнее добавленное означает, что сверху, а не внизу:
$topTwo = $xml->xpath('/*/Background[position() < 3]');
Возможное решение:
Функция Usort будет работать следующим образом:
function comp($a, $b) { return $b->Uses - $a->Uses; } usort($xml->Backgrounds, 'comp');
Другой способ – использовать XSLT с чем-то вроде этого:
<xsl:sort select="Uses"/>
Пример сортировки с помощью XSLT
XML-файл:
<employees> <employee hireDate="04/23/1999"> <last>Hill</last> <first>Phil</first> <salary>100000</salary> </employee> <employee hireDate="09/01/1998"> <last>Herbert</last> <first>Johnny</first> <salary>95000</salary> </employee> <employee hireDate="08/20/2000"> <last>Hill</last> <first>Graham</first> <salary>89000</salary> </employee> </employees>
Файл XSLF:
<!-- xq424.xsl: converts xq423.xml into xq425.xml --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="employees"> <xsl:apply-templates> <xsl:sort select="salary"/> </xsl:apply-templates> </xsl:template> <xsl:template match="employee"> Last: <xsl:apply-templates select="last"/> First: <xsl:apply-templates select="first"/> Salary: <xsl:apply-templates select="salary"/> Hire Date: <xsl:apply-templates select="@hireDate"/> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
?<!-- xq424.xsl: converts xq423.xml into xq425.xml --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="employees"> <xsl:apply-templates> <xsl:sort select="salary"/> </xsl:apply-templates> </xsl:template> <xsl:template match="employee"> Last: <xsl:apply-templates select="last"/> First: <xsl:apply-templates select="first"/> Salary: <xsl:apply-templates select="salary"/> Hire Date: <xsl:apply-templates select="@hireDate"/> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
Источник: http://www.xml.com/pub/a/2002/07/03/transform.html
Проверьте предикаты здесь: http://www.w3schools.com/XPath/xpath_syntax.asp для последних трех узлов.