首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SimpleXML数据的排序和分组

SimpleXML数据的排序和分组
EN

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
<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 15:59:01

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

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
$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
运行
复制
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
运行
复制
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
运行
复制
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 15:39:59

您可以使用

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

输出

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
$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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档