yusuf__
yusuf__

Reputation: 7

How can I sort the data we get from XML file in php with foreach?

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

Answers (3)

Casimir et Hippolyte
Casimir et Hippolyte

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>&#10;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

Upvotes: 0

XMehdi01
XMehdi01

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

nosurs
nosurs

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

Related Questions