PHP Sort XML Elements by Date

后端 未结 2 1835
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-20 10:09

Below is my XML file





00/00/0000
My Birthday
         


        
相关标签:
2条回答
  • 2020-12-20 10:42

    You have multiple questions here:

    1. You want to sort a list of SimpleXMLElements. A reference question for that is:
      • PHP sorting issue with simpleXML
    2. You need to append an element-into into a SimpleXMLElement which it does not support by default. This is outlined extensively in:
      • SimpleXML: append one tree to another
      • In SimpleXML, how can I add an existing SimpleXMLElement as a child element?

    Additionally the question about how to search a list of SimpleXMLElements can be further subdivided so your concrete question is not clear. From your question it looks like you've already understood you need to convert the list of SimpleXMLElements into an array.

    So you're probably looking for the reference question how to sort a multidimensional array as well:

    • How do I sort a multidimensional array in php

    As you can see your question has many facets which makes it hard to be answered. Stackoverflow works better if you ask a concrete programming question and not for a full script ;)

    0 讨论(0)
  • 2020-12-20 11:06

    Your array is fine. The next thing you need is usort:

    $xml=simplexml_load_string(<<<XML
    <?xml version="1.0"?>
    <calender>
    
    <task>
    <date>00/00/0000</date>
    <title>My Birthday</title>
    <description>Today is my birthday!</description>
    </task>
    
    <task>
    <date>04/08/2013</date>
    <title>test</title>
    <description>swdefswde</description>
    </task>
    
    <task>
    <date>04/02/2013</date>
    <title>test</title>
    <description>test</description>
    </task>
    
    <task>
    <date>04/01/2013</date>
    <title>egfwe</title>
    <description>wefwef</description>
    </task>
    
    <task>
    <date>04/03/2013</date>
    <title>ssdv</title>
    <description>ssdvs</description>
    </task>
    
    </calender>
    XML
    );
    $arr=array();
    foreach($xml->task as $aTask)
    {
        $arr[]=$aTask;
    }
    //print_r($arr);
    /* uncomment the above line to debug */
    usort($arr,function($a,$b){
        return strtotime($a->date)-strtotime($b->date);
    });
    //print_r($arr);
    /* uncomment the above line to debug */
    $xml=simplexml_load_string(<<<XML
    <?xml version="1.0"?>
    <calender>
    </calender>
    XML
    );
    foreach($arr as $aTask)
    {
        $tTask=$xml->addChild($aTask->getName());
        $tTask->addChild($aTask->date->getName(),(string)$aTask->date);
        $tTask->addChild($aTask->title->getName(),(string)$aTask->title);
        $tTask->addChild($aTask->description->getName(),(string)$aTask->description);
    }
    echo $xml->asXML();
    

    The echoed XML (manually formatting to make it look nicer):

    <?xml version="1.0"?>
    <calender>
    
    <task>
    <date>00/00/0000</date>
    <title>My Birthday</title>
    <description>Today is my birthday!</description>
    </task>
    
    <task>
    <date>04/01/2013</date>
    <title>egfwe</title>
    <description>wefwef</description>
    </task>
    
    <task>
    <date>04/02/2013</date>
    <title>test</title>
    <description>test</description>
    </task>
    
    <task>
    <date>04/03/2013</date>
    <title>ssdv</title>
    <description>ssdvs</description>
    </task>
    
    <task>
    <date>04/08/2013</date>
    <title>test</title>
    <description>swdefswde</description>
    </task>
    
    </calender>
    

    Requires PHP >= 5.3

    Live demo

    0 讨论(0)
提交回复
热议问题