Обработка XML, упорядочение и циклы
В течение 10 дней я изо всех сил пытался отрисовать фид XML:
http://feed.harjbains.gnomen-europe.com/xml-feed/
я пытался simplexml
, xmlDOM
и у XSLT все есть нюансы. Мои навыки программирования в настоящее время немного оспариваются, я не знаю, наркотики, которые мне дал доктор, или я просто старею и должен отказаться от хакерского кода.
Я изучил многомерные массивы, таблицы стилей JSON и XML, XSLT очень утомителен, не любит мой XML и мешает моей таблице стилей.
Я хочу иметь возможность отображать XML, отображая его либо date_updated, либо в ценовом порядке, ограничивая результаты по статусу и имея возможность ограничить количество записей до n.
Вот мой код для размещения каждого элемента в массиве, однако я не могу выполнить такую сортировку.
<?php
$xml = simplexml_load_file("http://feed.harjbains.gnomen-europe.com/xml-feed/");
$properties = $xml;
$id = array();
$beds = array();
$baths = array();
$price = array();
$address1 = array();
$area = array();
$postcode = array();
$date_updated = array();
$transaction = array();
$status = array();
$image = array();
$img = array();
$description = array();
$i=0;
$totrecs=0;
foreach ($properties as $property) {
$i=$i+1;
$address[$i] = $property->address1;
$id[$i] = $property->id;
$beds[$i] = $property->beds;
$baths[$i] = $property->baths;
$price[$i] = $property->price;
$address1[$i] = $property->address1;
$area[$i] = $property->area;
$postcode[$i] = $property->postcode;
$date_updated[$i] = $property->date_updated;
$transaction[$i] = $property->transaction;
$status[$i] = $property->status;
$image[$i] = $property->image;
$description[$i] = $property->description;
$totrecs = count($id);
if(isset($property->image->img)) {
//echo $address1[$i]."<BR>";
$image[$i] = true;
$x=0;
foreach($property->image->img as $a) {
$img[$i][$x]= $a;
//echo $img[$i][$x]."<BR>";
$x=$x+1;
}
} else {
$image[$i] = false;
}
}
?>
Harj
1 ответ
Пересмотрите XSLT, так как он поддерживает метод сортировки. Для демонстрации ниже преобразует исходный XML-канал в XML со свойствами, упорядоченными по цене в порядке убывания, выбирает только определенные элементы, фильтрует по первым 5 (<
эквивалентно <
) и только элементы со статусом = 'Let'.
XSLT (сохранить как файл.xsl или встроенную строку PHP)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/properties">
<xsl:copy>
<xsl:apply-templates select="property[position() < 6 and status='Let']">
<xsl:sort select="translate(price, ',', '')" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="property">
<xsl:copy>
<xsl:copy-of select="id|beds|baths|price|address1|area|postcode|date_updated|transaction|status|image|img|description"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
PHP (обязательно включите расширение php-xsl в файле.ini)
<?php
// LOAD XML FEED
$xml = simplexml_load_file("http://feed.harjbains.gnomen-europe.com/xml-feed/");
// LOAD XSLT SCRIPT
$xsl = new DOMDocument;
$xsl->load('XSLT_Script.xsl'); // OR $xsl->loadXML($xslstring);
// INITIALIZE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// TRANSFORM SOURCE TO NEW TREE
$newXML = $proc->transformToXML($xml);
// ECHO OUTPUT
echo $newXML;
// SAVE OUTPUT TO FILE
file_put_contents('Output.xml', $newXML);
?>
Выход
<properties>
<property>
<id>1184</id>
<beds>3</beds>
<baths>3</baths>
<image>
</image>
<price>695</price>
<area>Wolverhampton</area>
<address1>Park Hall Road</address1>
<description>A vastly extended three bedroom semi-detached property. Just been totally re-furbished. Comprising of front reception room, extended through lounge, third room which can be used as fourth bedroom. This leads into a shower room which has WC and basin. Utility room with plumbing. Fitted kitchen with gas cooker and hob. To the first floor, master bedroom with en-suite. Two further double bedrooms and family bathroom. Rear garden and front garden with drive for off-road parking.</description>
<postcode>WV4 5DU</postcode>
<date_updated></date_updated>
<transaction>2</transaction>
<status>Let</status>
</property>
<property>
<id>1176</id>
<beds>3</beds>
<baths>1</baths>
<image>
</image>
<price>575</price>
<area>Wolverhampton</area>
<address1>Park Hall Road</address1>
<description>A very well presented three bedroom semi-detached property which has been totally re-furbished. Living room, leading to dining room and fitted kitchen with cooker. Three bedrooms and new family bathroom with shower. New flooring and carpets throughout. Double glazed and gas central heated. Rear garden with patio, front garden with drive leading to garage. Available immediately.</description>
<postcode>WV4 5DU</postcode>
<date_updated></date_updated>
<transaction>2</transaction>
<status>Let</status>
</property>
<property>
<id>1181</id>
<beds>3</beds>
<baths>1</baths>
<image>
</image>
<price>550</price>
<area>Willenhall</area>
<address1>Westfield Road</address1>
<description>A very well presented three bedroom semi-detached property. Front reception room, large fitted kitchen with dining area. To the first floor, three bedrooms and modern family bathroom with separate shower cubicle. Front garden with space for off-road parking, rear garden. Double glazed and central heated throughout. Available immediately.</description>
<postcode>WV13 3JX</postcode>
<date_updated></date_updated>
<transaction>2</transaction>
<status>Let</status>
</property>
<property>
<id>1174</id>
<beds>3</beds>
<baths>1</baths>
<image>
</image>
<price>550</price>
<area>Willenhall</area>
<address1>Sandringham Avenue</address1>
<description>Three bedroom semi-detached property in popular residential area. Comprising of through lounge, fitted kitchen. Patio door to rear garden. Three bedrooms to first floor. Family bathroom with shower. Garage to side, front garden and off-road parking. Available immediately.</description>
<postcode>WV12 5TF</postcode>
<date_updated></date_updated>
<transaction>2</transaction>
<status>Let</status>
</property>
<property>
<id>1177</id>
<beds>3</beds>
<baths>1</baths>
<image>
</image>
<price>500</price>
<area>Willenhall</area>
<address1>Marshall Road</address1>
<description>Three bedroom semi-detached property. Comprising of two reception rooms, fitted kitchen to ground floor. Three bedrooms and family bathroom to first floor. Double glazed and central heated throughout. Front and rear gardens. Available immediately.</description>
<postcode>WV13 3PB</postcode>
<date_updated></date_updated>
<transaction>2</transaction>
<status>Let</status>
</property>
</properties>