对通过simplexml_load_file

时间:2015-06-05 06:58:54

标签: php xml sorting

在我开始提问之前, 我想指出我已经尝试过在这里发布的不同代码的点点滴滴, 而且我不太成功。

所以我正在处理一个从外部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
        }
    }
?>

0 个答案:

没有答案