【问题标题】:Sorting XML File into ascending order using php [duplicate]使用php将XML文件按升序排序[重复]
【发布时间】:2013-02-20 01:20:42
【问题描述】:

我有一个 xml 文件,其中包含大约 60 本书,我需要使用 php 从借来的计数中按升序排列到目前为止,我的代码显示了所有书籍但不会排序?任何帮助都会非常感激

PHP

<?php


$xmlassignDoc = new DOMDocument();
$xmlassignDoc->load("books.xml");


$books = $xmlBookDoc->getElementsByTagName("item");

foreach($books as $list)
{
    $course = $list->getElementsByTagName("course");
    $course = $course->item(0)->nodeValue;


//HERE is where the GET function will be
    if ($course == "CC150")
    {

    print_r($array);
        $id = $list->getAttribute("id");
        echo "<b>Book ID: </b> $id <br>";

         $title = $list->getElementsByTagName("title");
         $title = $title->item(0)->nodeValue;
         echo "<b>Title: </b> $title <br>";

         $isbn = $list->getElementsByTagName("isbn");
         $isbn = $isbn->item(0)->nodeValue;
         echo "<b>ISBN: </b> $isbn <br>";

         $borrowed = $list->getElementsByTagName("borrowedcount");
         $borrowed = $borrowed->item(0)->nodeValue;
         echo "<b>Borrowed Count: </b> $borrowed <br>";
         echo "<br>";
    } 
}
//print $xmlBookDoc->saveXML();
?>

xml 文件

<?xml version="1.0" encoding="utf-8"?>
<bookcollection>
<items>
  <item id="51390">
     <title>Management of systems development /</title>
     <isbn>0091653215</isbn>
     <url>http://library.hud.ac.uk/catlink/bib/51390</url>
     <borrowedcount>45</borrowedcount>
     <courses>
        <course>CC140</course>
        <course>CC210</course>
     </courses>
  </item>
  <item id="483">
     <title>Database systems management and design /</title>
     <isbn>0877091153</isbn>
     <url>http://library.hud.ac.uk/catlink/bib/483</url>
     <borrowedcount>28</borrowedcount>
     <courses>
        <course>CC140</course>
     </courses>
  </item>
  <item id="585842">
     <title>E-learning skills /</title>
     <isbn>0230573126</isbn>
     <url>http://library.hud.ac.uk/catlink/bib/585842</url>
     <borrowedcount>5</borrowedcount>
     <courses>
        <course>CC157</course>
     </courses>
  </item>

【问题讨论】:

  • 如果您不隐式编写一些对其进行排序的代码,您就不能期望对 XML 文件进行排序。尝试更改您的循环,以便将所有值保存到一个数组中,然后使用自定义排序函数,您可以在其中选择要排序的列。
  • 抱歉忘记写了,我确实尝试过 ksort 等,但它没有工作,所以删除了我目前所拥有的代码
  • 这是干什么用的? if ($course == "CC150");您是否还根据课程进行过滤?
  • 杰克我必须添加用户输入,这样他们就可以输入不同的课程,然后按借阅次数的升序显示该课程中的书籍

标签: php xml


【解决方案1】:

我的解决方案:

$books = array();

$xml = simplexml_load_file('books.xml'); 

foreach($xml->items->item as $item) {
    $books[] = array(
                     'id'             => (string)$item->attributes()->id,
                     'title'          => (string)$item->title,
                     'isbn'           => (string)$item->isbn,
                     'course'         => (string)$item->courses->course[0],
                     'borrowed_count' => intval($item->borrowedcount)
                    );
}


array_sort_by_column($books, 'borrowed_count');

var_dump($books);

以及排序功能:

function array_sort_by_column(&$array, $column, $direction = SORT_ASC) {
    $reference_array = array();

    foreach($array as $key => $row) {
        $reference_array[$key] = $row[$column];
    }

    array_multisort($reference_array, $direction, $array);
}

【讨论】:

  • 有没有办法在每个借用计数的末尾添加换行符以使其更易于阅读?
  • array_sort_by_column 好像不是 PHP 函数可悲?
  • @YannChabot 不,这就是我构建自己的原因:) 这就是 PHP 的美妙之处。
  • 哦没看到函数谢谢:-)
【解决方案2】:

文件'1.php':

<?php
include 'books.php';
$b=new books();
$arr=$b->load('books.xml');         //1. load books from xml to array
usort($arr, array('books','cmp'));  //2. sort array
$b->save('out.xml',$arr);           //3. save array to xml
?>

文件'books.php':

<?php
  class books
  {
     //load books from xml to array
     public function load($fname)
     {
        $doc=new DOMDocument();

        if($doc->load($fname))  $res=$this->parse($doc);
        else                    throw new Exception('error load XML');

        return $res;
     }


     static public function cmp($a, $b)
     {
         if ($a['fields']['borrowedcount'] == $b['fields']['borrowedcount']) {
             return 0;
         }
         return ($a['fields']['borrowedcount'] < $b['fields']['borrowedcount']) ? -1 : 1;
     }


     private function parse($doc)
     {
        $xpath = new DOMXpath($doc);
        $items = $xpath->query("items/item");
        $result = array();
        foreach($items as $item)
        {
           $result[]=array('id'=>$item->getAttribute('id'), 'fields'=>$this->parse_fields($item));
        }
        return $result;
     }


     private function parse_fields($node)
     {
        $res=array();
        foreach($node->childNodes as $child)
        {
           if($child->nodeType==XML_ELEMENT_NODE)
           {
              $res[$child->nodeName]=$this->get_value($child);
           }
        }

        return $res;
     }

     private function get_value($node)
     {
        if($node->nodeName=='courses')
        { 
           $res=array();
           foreach($node->childNodes as $child)
           {
              if($child->nodeType==XML_ELEMENT_NODE)
              {
                 $res[]=$child->nodeValue;
              }
           } 
           return $res;
        }
        else
        {
           return $node->nodeValue;
        }
     }

     //save array to xml
     public function save($fname, $rows)
     {
        $doc = new DOMDocument('1.0','utf-8');
        $doc->formatOutput = true;

        $bc = $doc->appendChild($doc->createElement('bookcollection'));
        $items = $bc->appendChild($doc->createElement('items'));

        foreach($rows as $row)
        {
           $item=$items->appendChild($doc->createElement('item'));
           $item->setAttribute('id',$row['id']);
           foreach($row['fields'] as $field_name=>$field_value)
           {
              $f=$item->appendChild($doc->createElement($field_name));
              if($field_name=='courses')
              {
                 foreach($field_value as $course_val)
                 {
                    $course=$f->appendChild($doc->createElement('course'));
                    $course->appendChild($doc->createTextNode($course_val));
                 }
              }
              else
              {
                 $f->appendChild($doc->createTextNode($field_value));
              }

           }
        }

        file_put_contents($fname, $doc->saveXML());
     }

  }
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多