我整理与从XML文件分组发布数据。 我目前使用的方法是在大多数情况下工作正常,但我觉得有做什么,我试图完成一个更有效的方式。
这里的目标节点是什么样子的示例:
<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将其转换为一个数组
- 利用其比较usort函数(STRCMP)的SERIESNAME属性,排序的所有系列的字母顺序。
- 我使用的查询字符串,每个页面可以指定每个字母,并使用该查询字符串比较信的seriesfirstletter值的IF语句。 因此,只有适用的节点返回。
- 然后我开始我的foreach语句。 呼应了我想要的数据,到李的项目。
- 最后,我使用jQuery看ID的每个LI项目,并在视觉上它们分组。 我创建一个使用SERIESNAME,用空格去掉,为ID的PHP变量。 它插入一个H4与适当的系列名称的标题,该组的上方,并插入组下方分离DIV。
虽然字母排序工作正常。 我也想同系列内的问题有待数字顺序排序。 当前不工作。 眼下,数字排序看上去是这样的:1,10,12,2,3。
我想获得理顺数值排序问题。 我也觉得我目前在做jQuery的分组,在PHP中可以做,而我经历的循环。 在一个更好/更有效的方式来处理这些数据的任何建议,将不胜感激。
比方说,你已经得到了所有<comic>
元素作为一个迭代器了。 首先,它转换成一个数组,所以我们可以使用数组功能:
$comics = iterator_to_array($comics, 0);
然后,你要根据一定的价值,在这里的价值这个数组排序<issuenr>
的孩子。 这是可以做到的usort
和一个回调函数的帮助:
$success = usort($comics, function($a, $b) {
return strnatcmp($a->issuenr, $b->issuenr);
});
回调函数只挑选你想与对方比较具体的值,并将它传递给strnatcmp
这是自然秩序的比较,我上面的评论。
下面的代码示例演示了如何列出符合特定搜索字母,所有系列natsort
版和独特(没有重复的名字,分组)。
搜索和分组都与一个完成xpath
查询:
$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";
}
这一操作将输出排序列表:
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
在要列出该系列的所有漫画中的下一个步骤,那将是一个内部的foreach:
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);
}
}
然后将获取的每个系列,输出漫画:
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
在的代码xpath_string
功能可以在我的另一个答案被找到 。
您可以使用
$key = "id" ;
$iterator = new SimpleXMLIterator($xml);
$array = json_decode(json_encode($iterator), TRUE);
__xsort($array['comic'],"id") ;
var_dump($array['comic']);
产量
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
$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功能使用