在php

时间:2015-10-11 09:46:49

标签: php xml sorting

我对编码非常陌生,我的大学有一些练习练习,第一个是使用XML文档并使用我已设法做的php返回数据,但下一步是按以下方式对数据进行排序一个名为' note_id'的新子元素或者添加一个' id'属性到note元素,然后按降序显示数据。我添加了一个新的note_id子元素,并在其他元素的中间插入了note_id number 6,以查看它是否会排序。

我通过在互联网上查询信息尝试了很多事情,但我觉得我只是围着圈子,因为我是新手,似乎没什么用(显然我不知道我是什么)做 - 但必须从某处开始)。

我还没有发布这个问题只是为了得到答案,我还需要了解如果有人回复答案,这种方法的工作原理和原因。

我的XML数据如下所示,存储在名为' note.xml'的文件中。

    <?xml version="1.0" encoding="UTF-8"?>
<notes>
<note>
<note_id>1</note_id>
<to>tove1</to>
<from>Jani1</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

<note>
<note_id>2</note_id>
<to>tove2</to>
<from>Jani2</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

<note>
<note_id>3</note_id>
<to>tove3</to>
<from>Jani3</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

<note>
<note_id>6</note_id>
<to>tove6</to>
<from>Jani6</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

<note>
<note_id>4</note_id>
<to>tove4</to>
<from>Jani4</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

<note>
<note_id>5</note_id>
<to>tove5</to>
<from>Jani5</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

</notes>

我当前的PHP代码在下面带回了XML。

?php
// Loads the xml file.
$xml= simplexml_load_file("note.xml");
// Returns the top level xml element - notes.
echo $xml->getName() . "<br />";


// Returns each note element.
foreach($xml->note as $note){
     echo $note->getName() . ": " . $note . "<br />";
// Returns each child element of note element.
    foreach($note->children() as $child){
        echo $child->getName() . ": " . $child . "<br />";

    }

    echo "<br />";
}


echo "<br />";


?>

1 个答案:

答案 0 :(得分:1)

这是一个如何做到这一点的例子:

  • 加载note.xml文件。在这种情况下,我使用了一个自定义Note类,它将通过将文件传递给构造函数来加载文件。
  • 您想要按'note_id'对xml进行排序。为此,您可以将xml转换为数组数组,其中数组基本上是注释。
  • 既然你有一个数组数组,你可以使用php native usort函数对它们进行排序:

  • 然后,您可以根据排序的数组数组生成新的xml。

示例:

<?php
class Note
{
    /**
     * @var array
     */
    private $notes = [];

    /**
     * @param $fileName
     */
    public function __construct($fileName)
    {
        $xml = simplexml_load_file($fileName);
        $this->simpleXMLElementToArray($xml);
    }

    /**
     * Convert the SimpleXMLElement to array format.
     *
     * @param SimpleXMLElement $xml
     */
    protected function simpleXMLElementToArray(SimpleXMLElement $xml)
    {
        // For each note, create an associative array and add it to the $notes array
        foreach ($xml->note as $note) {
            $this->notes[] = json_decode(json_encode($note), true);
        }
    }

    /**
     * Sort the internal $notes array using usort.
     *
     * http://php.net/manual/en/function.usort.php
     */
    public function sortByNoteIdDescending()
    {
        usort($this->notes, array('Note', 'sortNotesArrayByNoteIdDescending'));
    }

    /**
     * Custom function to sort by note_id.
     *
     * @param array $note1
     * @param array $note2
     * @return int
     */
    protected function sortNotesArrayByNoteIdDescending(array $note1, array $note2)
    {
        if ($note1['note_id'] == $note2['note_id']) {
            return 0;
        } else if ($note1['note_id'] < $note2['note_id']) {
            return 1;
        } else {
            return -1;
        }
    }

    /**
     * Generate xml from the internal $notes array.
     */
    public function toXml()
    {
        $xml = new SimpleXMLElement('<notes/>');

        foreach ($this->notes as $note ) {
            $noteElement = $xml->addChild('note');
            $noteElement->addChild("note_id", $note["note_id"]);
            $noteElement->addChild("to", $note["to"]);
            $noteElement->addChild("from", $note["from"]);
            $noteElement->addChild("body", $note["body"]);
        }

        // To generate a nice output format
        $dom = dom_import_simplexml($xml)->ownerDocument;
        $dom->formatOutput = true;

        return $dom->saveXML();
    }
}

$note = new Note('note.xml');
$note->sortByNoteIdDescending();
echo $note->toXml();