Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SimpleXML数据的排序和分组

SimpleXML数据的排序和分组
EN

Stack Overflow用户
提问于 2012-10-06 07:12:20
回答 2查看 1.6K关注 0票数 1

我正在对XML文件中的发布数据进行排序和分组。我目前使用的方法大部分都很好,尽管我觉得有一种更有效的方法来完成我想要完成的任务。

下面是目标节点外观的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<comic>
      <id>117</id>
      <mainsection>
        <series>
          <displayname>My Amazing Adventure</displayname>
          <sortname>My Amazing Adventure</sortname>
        </series>
      </mainsection>
      <issuenr>2</issuenr>
      <seriefirstletter>
        <displayname>M</displayname>
        <sortname>M</sortname>
      </seriefirstletter>
    </comic>

以下是我目前正在采取的步骤。

  • 用SimpleXML加载XML文件
  • 指定目标节点并使用iterator_to_array将其转换为数组
  • 使用比较(strcmp)序列化名称属性的usort函数按字母顺序对所有系列进行排序。
  • 我正在为每个页面使用一个查询字符串来指定字母表中的每个字母,并使用一个IF语句将查询字符串字母与序列首字母值进行比较。因此,只返回适用的节点。
  • 然后我开始我的预测语句。把我想要的数据回音到李项中。
  • 最后,我使用jQuery查看每个LI项目的ID,并对它们进行可视化分组。我已经创建了一个PHP变量,它使用了ID的序列化名,去掉了空格,它在组的上方插入了一个带有正确系列名称的H4标题,并在组下面插入了一个分离的DIV。

而按字母顺序排序的工作正常。我还希望对同一系列中的问题进行数值排序。--它目前不起作用。现在,数字排序顺序如下所示: 1,10,12,2,3。

我想把数字排序问题弄清楚。我还觉得,我目前在jQuery中所做的分组,可以在PHP中完成,而我正在遍历循环。如能就处理这些数据的更好/更有效的方法提出任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-06 07:59:01

假设您已经将所有<comic>元素作为迭代器。首先,将其转换为数组,这样我们就可以使用数组函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$comics = iterator_to_array($comics, 0);

然后,您想要根据某个值对这个数组进行排序,这里是<issuenr>子值。这可以通过usort和回调函数的帮助来完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$success = usort($comics, function($a, $b) {
    return strnatcmp($a->issuenr, $b->issuenr);
});

回调函数只是选择要相互比较的具体值,并将其传递给strnatcmp,这是我前面评论过的自然顺序比较。

下面的代码示例显示了如何列出与特定搜索字母( natsorted和distinct )匹配的所有系列(没有重复名称,分组)。

搜索和分组都是通过一个xpath查询完成的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$searchval = 'T';

$file = 'compress.zlib://comiclist10-12.xml.gz';

$xml = simplexml_load_file($file);

$series = $xml->xpath(
    "/*/comiclist/comic[./seriefirstletter/displayname = '$searchval']
        /mainsection/series/sortname[
            not(. = ../../../following-sibling::comic/mainsection/series/sortname)
        ]"
);

natsort($series);

foreach($series as $serie)
{
    echo $serie, "\n";
}

然后,这将输出排序列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Tale of the Batman: Gotham by Gaslight, A
Tales of Suspense: Captain America & Iron Man #1 Commemorative Edition
Tales to Astonish, Vol. 1
Teenage Mutant Ninja Turtles
Teenage Mutant Ninja Turtles Micro Series
Teenage Mutant Ninja Turtles Ongoing
Terminator / Robocop: Kill Human
Thanos
Thing, Vol. 1
Thor, Vol. 2
Thor, Vol. 3
Thor: Blood Oath
Thor: For Asgard
Thor: Man of War
Thor: Son of Asgard
Thor Annual
Thor Corps
Thundercats
Thundercats (DC Comics - Wildstorm)
Thundercats: Enemy's Pride
Tomb of Dracula, Vol. 4, The
Torch, The
Toxin
Transformers: Armada
Transformers: Generation One
Transformers: Infiltration
Truth: Red, White & Black

在接下来的步骤中,您希望列出该系列中的所有漫画,这将是一个内在的预见:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach ($series as $serie) {
    echo $serie, "\n";

    $string = xpath_string($serie);

    $comics = $serie->xpath("../../../../comic[./mainsection/series/sortname = $string]");

    foreach ($comics as $i => $comic) {
        printf(" %d. id: %s\n", $i+1, $comic->id);
    }
}

然后获取每个系列的漫画,输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Tale of the Batman: Gotham by Gaslight, A
 1. id: 8832
Tales of Suspense: Captain America & Iron Man #1 Commemorative Edition
 1. id: 3591
Tales to Astonish, Vol. 1
 1. id: 3589
Teenage Mutant Ninja Turtles
 1. id: 117
Teenage Mutant Ninja Turtles Micro Series
 1. id: 13789
Teenage Mutant Ninja Turtles Ongoing
 1. id: 13780
 2. id: 13782
 3. id: 13787
Terminator / Robocop: Kill Human
 1. id: 13775
Thanos
 1. id: 3597
Thing, Vol. 1
 1. id: 3746
Thor, Vol. 2
 1. id: 5873
Thor, Vol. 3
 1. id: 1035
 2. id: 1635
 3. id: 2318
 4. id: 2430
 5. id: 2463
 6. id: 3333
 7. id: 3616
 8. id: 11731
 9. id: 11733
Thor: Blood Oath
 1. id: 3635
 2. id: 3636
Thor: For Asgard
 1. id: 11545
 2. id: 11546
Thor: Man of War
 1. id: 3644
Thor: Son of Asgard
 1. id: 538
 2. id: 3645
Thor Annual
 1. id: 5868
Thor Corps
 1. id: 3640
Thundercats
 1. id: 209
Thundercats (DC Comics - Wildstorm)
 1. id: 3654
Thundercats: Enemy's Pride
 1. id: 3649
Tomb of Dracula, Vol. 4, The
 1. id: 3719
Torch, The
 1. id: 2328
 2. id: 2330
 3. id: 2461
Toxin
 1. id: 3720
Transformers: Armada
 1. id: 3737
Transformers: Generation One
 1. id: 557
Transformers: Infiltration
 1. id: 3729
 2. id: 3731
Truth: Red, White & Black
 1. id: 3750
 2. id: 3751

function can be found in another answer of mine的代码。

票数 1
EN

Stack Overflow用户

发布于 2012-10-06 07:39:59

您可以使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$key = "id" ;
$iterator = new SimpleXMLIterator($xml);
$array = json_decode(json_encode($iterator), TRUE);
__xsort($array['comic'],"id") ;
var_dump($array['comic']);

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array
  0 => 
    array
      'id' => string '1' (length=1)
      'mainsection' => 
        array
          'series' => 
            array
              ...
  1 => 
    array
      'id' => string '2' (length=1)
      'mainsection' => 
        array
          'series' => 
            array
              ...
  2 => 
    array
      'id' => string '3' (length=1)
      'mainsection' => 
        array
          'series' => 
            array
              ...
  3 => 
    array
      'id' => string '10' (length=2)
      'mainsection' => 
        array
          'series' => 
            array
              ...
  4 => 
    array
      'id' => string '12' (length=2)
      'mainsection' => 
        array
          'series' => 
            array
              ... 

XML USed

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$xml = "<comics>
<comic>
      <id>1</id>
      <mainsection>
        <series>
          <displayname>My Amazing Adventure - 1</displayname>
          <sortname>My Amazing Adventure</sortname>
        </series>
      </mainsection>
    </comic>

<comic>
      <id>10</id>
      <mainsection>
        <series>
          <displayname>My Amazing Adventure - 10</displayname>
          <sortname>My Amazing Adventure</sortname>
        </series>
      </mainsection>
    </comic>

<comic>
      <id>12</id>
      <mainsection>
        <series>
          <displayname>My Amazing Adventure 12</displayname>
          <sortname>My Amazing Adventure</sortname>
        </series>
      </mainsection>
    </comic>

<comic>
      <id>2</id>
      <mainsection>
        <series>
          <displayname>My Amazing Adventure 2</displayname>
          <sortname>My Amazing Adventure</sortname>
        </series>
      </mainsection>
    </comic>


<comic>
      <id>3</id>
      <mainsection>
        <series>
          <displayname>My Amazing Adventure 3</displayname>
          <sortname>My Amazing Adventure</sortname>
        </series>
      </mainsection>
    </comic>

</comics>" ;

xsort Function Used

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12760980

复制
相关文章
mysql实现分组排序和不分组排序
大前提 假如你不懂mysql中“=”和“:=”的区别,需要去补习一下这两个知识的用法。 关于mysql中“=”和“:=”的区别,可以参考我的另外一篇文章。https://blog.csdn.net/weixin_41261833/article/details/103509526 本文如果有不懂的地方,可以留言。 一、不分组排序 1、普通排名:从1开始,按照顺序一次往下排(相同的值也是不同的排名)。 -- 方法一 select m.*,@r :=@r + 1 as rank from mian62 m,(s
数据分析与统计学之美
2021/11/25
3.6K0
MySQL的排序和分组
order by和group by这两个要十分注意,因为一不小心就会产生文件内排序,即file sort,这个性能是十分差的。下面来看具体的案例分析。
贪挽懒月
2021/05/18
3.3K0
MySQL的排序和分组
第十课 分组数据创建分组过滤分组分组和排序
** having和where的区别 **: ** where在数据分组前进行过滤,having在数据分组后进行过滤,where过滤的是行,having过滤的是分组 **
desperate633
2018/08/22
1.3K0
第十课 分组数据创建分组过滤分组分组和排序
js数据如何分组排序?
前面通过两章,细致的讲解了数组的方法,而且提供了简单的例子,相信大家都有初步的了解了,而且也相信大家都有所得,今天来实战,数据如何分组呢?要应用数组的那些知识呢? 如果还没有学习前面两章的,请点击: 你对JavaScript的Array对象了解有多少? ES6中Array数组你应该知道的操作
Javanx
2019/09/04
2.9K0
python分组排序_Python 排序分组问题
_list = [{‘value’: 123, ‘upclock’: 1234567},
全栈程序员站长
2022/07/04
1.3K0
mysql分组和排序同时使用时查询数据异常
每个地点每天新增一条数据,要根据地点分组查询出每个设备最新的数据(按创建时间倒序)。
iiopsd
2022/12/23
2K0
mysql中分组排序_oracle先分组后排序
​ 窗口函数(window functions),也被称为 “开窗函数”,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可对数据库数据进行实时分析处理。它是数据库的标准功能之一,主流的数据库比如Oracle,PostgreSQL都支持窗口函数功能,MySQL 直到 8.0 版本才开始支持窗口函数。
全栈程序员站长
2022/11/10
7.9K0
Go 分组 & 排序
其中,排序的代码是 go sdk 提供的 go1.16.4/src/sort/slice.go :
一个会写诗的程序员
2022/06/22
6880
javascript: 带分组数据的Table表头排序
接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local)、(开发小组内自测的)开发环境(dev)、(提供给测试团队的)测试环境(test)、预发布环境(pre)、正式生产环境(prod),每种环境都有各自的配置参数,比如:数据库连接、远程调用的ws地址等等。如果每个环境build前手动修改这些参数,显然太不fashion. maven早就考虑到了这些问题,看下面的pom片段: 1 <profiles> 2 <profile> 3
菩提树下的杨过
2018/01/19
1.4K0
javascript: 带分组数据的Table表头排序
Pandas|排序,分组,组内排序
01 Pandas的基本排序 Pandas的主要数据结构有2个:DataFrame,Series,针对这两个类型的排序Demo如下: #coding=utf-8 import pandas as pd import numpy as np #以下实现排序功能。 series=pd.Series([3,4,1,6],index=['b','a','d','c']) frame=pd.DataFrame([[2,4,1,5],[3,1,4,5],[5,1,4,2]],columns=['b
double
2018/04/02
7.3K0
Python分组内排序
Code : two_di_list = [[0, 1], [2, 3, 4]] for sub_list in two_di_list: sub_list.sort(reverse=True) print(two_di_list) Output : [[1, 0], [4, 3, 2]]
py3study
2020/01/03
6950
分组合计且排序和显示名称
        分组合计的一个问题是,合计中最大的问题是:只能显示groupby的字段,不能显示其它的字段。有时还需要排序,就很麻烦。这里有一个实现。 SELECT a.*, b.zu_no AS zuhao, b.qu AS quming, b.dui AS duiming, b.zu AS zuming FROM (SELECT qu + '-' + dui + '-' + zu AS E1, COUNT(*) AS cnt         FROM PETRO_WELL         GROUP B
用户1075292
2018/01/23
9270
mysql的分组排序limit问题
作者:matrix 被围观: 7,332 次 发布时间:2018-05-03 分类:零零星星 | 一条评论 »
HHTjim 部落格
2022/09/26
1.8K0
自定义分区、数据类型、排序、分组
自定义分区、数据类型、排序、分组 /** * * @author 自定义数据类型 键对象 * */ public class KeyPair implements WritableComparable<KeyPair> { private int year; private double hot; public int getYear() { return year; } public void setYear(int year) {
汤高
2018/01/11
8420
Hadoop学习笔记—11.MapReduce中的排序和分组
  从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排序和分组,默认情况下,是按照key进行排序和分组。
Edison Zhou
2018/08/20
7920
Hadoop学习笔记—11.MapReduce中的排序和分组
DQL语句排序与分组
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。
星哥玩云
2022/09/15
9720
DQL语句排序与分组
「R」分组应用和排序去重的应用与比较
如果使用惯了tidyverse套装,我们脑子里容易冒出来的是这样的解法:使用分组应用。
王诗翔呀
2022/01/21
9610
「R」分组应用和排序去重的应用与比较
【mysql】分组后排序失效
今天写了一个sql,主要目的是查询分组后最新的一条数据,原本的关系是1对多,想通过分组后实现1对1的逻辑关系,而且要保证分组后的数据是按照创建时间排序,确保是最新的一条。
无敌小菜鸟
2022/05/25
4.4K0
【mysql】分组后排序失效
wpf listview 分组_JAVA排序
网上很多方法,但是内容包含太全面,代码看上去很复杂,其实其中有很多是控制UI的,此种方法一行代码自动解决排序问题,另外,wpf的listview和winform的listview细节差别还是很多的。
全栈程序员站长
2022/11/15
8980
wpf listview 分组_JAVA排序
MapReduce分组排序OrderBean(二)
在Map阶段,我们需要对输入数据进行处理,并输出一个或多个键值对。在分组排序中,我们需要将输入数据按照group分组,并对每个组内的数据按照value进行排序。因此,我们可以在Map函数中实现对输入数据的分组和排序操作。具体实现如下:
堕落飞鸟
2023/05/13
2680

相似问题

数据帧分组和排序

13

列表数据的排序和分组

10

WPF数据网格分组和排序

32

Pandas数据帧分组和排序

320

Oracle中的数据排序和分组

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文