Reputation: 7
I want to sort all datas i get from xml files. How can i sort order by asc as "$myLink->Tanim"(Brand Name) or others.
// Ignore this line // Ignore this line
My Xml File
<?xml version="1.0" encoding="utf-8"?>
<Markalar>
<Marka>
<MarkaID>1</MarkaID>
<Tanim>NUXE</Tanim>
</Marka>
<Marka>
<MarkaID>2</MarkaID>
<Tanim>Markasız</Tanim>
</Marka>
<Marka>
<MarkaID>3</MarkaID>
<Tanim>MUSTELA</Tanim>
</Marka>
<Marka>
<MarkaID>4</MarkaID>
<Tanim>SOLGAR</Tanim>
</Marka>
<Marka>
<MarkaID>5</MarkaID>
<Tanim>AVENE</Tanim>
</Marka>
<Marka>
<MarkaID>6</MarkaID>
<Tanim>DUCRAY</Tanim>
</Marka>
<Marka>
<MarkaID>7</MarkaID>
<Tanim>PHYTO</Tanim>
</Marka>
................
My PHP File
<?php
$myXML = simplexml_load_file("files/Markalar.xml") or die("Can't reach XML files");
foreach ($myXML->children() as $myLink) {
echo '<a class="col-sm-3 col-xs-6" id="' . $myLink->MarkaID . '" href="#" title="">' . $myLink->Tanim . '</a><br>';
}
?>
Upvotes: 0
Views: 358
Reputation: 89557
Using an XSLT is also an option that produces all the links in one shot:
$doc = new DOMDocument;
$doc->load('files/Markalar.xml');
$stylesheet = new DOMDocument;
$stylesheet->load('files/Markalar.xsl');
$proc = new XSLTProcessor();
$proc->importStylesheet($stylesheet);
echo $proc->transformToXML($doc);
Markalar.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:template match="Markalar">
<xsl:apply-templates>
<xsl:sort select="translate(Tanim, $lower, $upper)"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Marka">
<xsl:variable name="id" select="MarkaID"/>
<a class="col-sm-3 col-xs-6" id="{$id}" title="">
<xsl:value-of select="Tanim"/>
</a><br/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Upvotes: 0
Reputation: 1
Import data from an XML file using simplexml_load_file
turn data inside XML file into a structure where the original XML being a series of <Marka>
nodes under only one single parent node looks example below:
$myXML = simplexml_load_file("Markalars.xml") or die("Can't reach XML files");
echo "<pre>";
print_r($myXML);
Will Prints:
SimpleXMLElement Object
(
[Marka] => Array
(
[0] => SimpleXMLElement Object
(
[MarkaID] => 1
[Tanim] => NUXE
)
[1] => SimpleXMLElement Object
(
[MarkaID] => 2
[Tanim] => Markasız
)
[2] => SimpleXMLElement Object
(
[MarkaID] => 3
[Tanim] => MUSTELA
)
[3]...
)
)
What we can do to sort, So we going to create an array by looping through the nodes and get each node <Marka>
.
$sortable = [];
foreach($myXML->Marka as $node) {
$sortable[] = $node;
}
print_r($sortable);
Prints:
Array
(
[0] => SimpleXMLElement Object
(
[MarkaID] => 1
[Tanim] => NUXE
)
[1] => SimpleXMLElement Object
(
[MarkaID] => 2
[Tanim] => Markasız
)
[2] => SimpleXMLElement Object
(
[MarkaID] => 3
[Tanim] => MUSTELA
)
[3]...
)
Now, it is easy to sort the array alphabetically by using usort
function with a callback function compareTanim
.
function compareTanim($a, $b)
{
return strcmp($a->Tanim, $b->Tanim);
}
usort($sortable,'compareTanim');
Lastly, you could display sorted array by order ascending as links...
foreach ($sortable as $Marka) {
echo '<a id="'.$Marka->MarkaID.'" href="#" >'.$Marka->Tanim. '</a><br>';
}
Upvotes: 0
Reputation: 665
Collect the XML data you need into an array first, then sort the array:
$myXML = simplexml_load_file("files/Markalar.xml") or die("Can't reach XML files");
$data = [];
foreach ($myXML->children() as $myLink) {
$key = $myLink->MarkaID->__toString();
$value = $myLink->Tanim->__toString();
$data[$key] = $value;
}
asort($data); // [5 => "AVENE", 6 => "DUCRAY", ...]
foreach ($data as $id => $tanim) {
echo '<a class="col-sm-3 col-xs-6" id="' . $id . '" href="#" title="">' . $tanim . '</a><br>';
}
For more advanced sorting needs, you can always resort to uasort.
Upvotes: 1