在我开始提问之前, 我想指出我已经尝试过在这里发布的不同代码的点点滴滴, 而且我不太成功。
所以我正在处理一个从外部XML文件加载项目描述数据的页面。我使用simplexml_load_file函数加载到xml文件中。
XML文件:
<?xml version='1.0' encoding='UTF-8'?>
<items>
<item category="Game">
<year>2015</year>
<projectName>Some Game</projectName>
<clientName>Some Company</clientName>
<imagePath>some_imagefile.png</imagePath>
<types>
<type>Work A</type>
<type>Work B</type>
</types>
<languages>
<language>Language X</language>
<language>Language Y</language>
<language>Language Z</language>
</languages>
<platforms>
<platform>Device 1</platform>
</platforms>
<visible>false</visible>
</item>
</items>
上面的XML文件在我的PHP中加载:
<?php
$xml = simplexml_load_file("myXMLfile.xml") or die("Error: cannot create object");
?>
我能够成功加载XML数据并按照我想要的方式使用检索到的数据,除非它没有被订购。
所以我在这里和那里探索并发现我可以在将值传递给数组并使用usort()之后对我的SimpleXMLElement进行排序。
所以这就是我所做的:
function sortByYearDesc($a, $b) {
if ($a->year == $b->year) {
return 0;
}
return $a->year > $b->year ? -1 : 1;
}
function sortByProjectNameAsc($a, $b) {
return strcmp($a->projectName, $b->projectName);
}
$xmlArray = array();
foreach ($xml->item as $iTemp) {
$xmlArray[] = iTemp;
}
usort($xmlArray, "sortByProjectNameAsc");
usort($xmlArray, "sortByYearDesc");
我使用了两个不同的排序函数来按项目名称(升序)和年份(降序)对项目进行排序。因此我在游戏发行年份显示项目,而同年发布的标题按其标题的升序显示。
在我添加sort函数之前回溯到我原来的代码中,我一直在使用加载的SimpleXMLElement做这样的事情:
<?php
foreach ($xml->item as items) {
// get_bool is a function that I made to switch a boolean to a String
if (get_bool($items->visible)) {
// echo stuff
// by stuff I mean any xml data to display
}
}
?>
我认为我可以简单地将SimpleXMLElement替换为数组:
<?php
foreach ($xmlArray->item as items) {
// I changed $xml to $xmlArray
if (get_bool($items->visible)) {
// echo stuff
// by stuff I mean any xml data to display
}
}
?>
我收到一条消息&#34;警告:为foreach()&#34;提供的参数无效。
有什么建议吗? 我错过了什么?
*****添加了*****
首先,感谢splash58指出我的代码中缺少$。 除此之外,我确实找到了一个解决方案,如下所示:
function sortByYearDesc($a, $b) {
// I noticed that the value was compared in String value, not as an integer
// so I casted each value to int
if ((int)$a->year == (int)$b->year) {
return 0;
}
return (int)$a->year > (int)$b->year ? -1 : 1;
}
function sortByProjectNameAsc($a, $b) {
return strcmp($a->projectName, $b->projectName);
}
$xmlArray = array();
foreach ($xml->item as $iTemp) {
$xmlArray[] = $iTemp; // changed "iTemp" to "$iTemp"
}
usort($xmlArray, "sortByProjectNameAsc");
usort($xmlArray, "sortByYearDesc");
我在PHP的echo部分也缺少$,我在实际代码中有这个但是在我发布的代码中没有:
<?php
// original post:
// foreach ($xmlArray->item as items) {
// xmlArray already is an array of "item" so does not need to go to the "item" node
// and the obvious change from "items" to "$items"
foreach ($xmlArray as $items) {
// I changed $xml to $xmlArray
if (get_bool($items->visible)) {
// echo stuff
// by stuff I mean any xml data to display
}
}
?>