1

我有一个 XML 文件,其中包含以下数据……</p>

<posts>
  <post id="22359">
    <postviews>31</postviews>
  </post>
  <post id="20963">
    <postviews>1</postviews>
  </post>
  <post id="20595">
    <postviews>3</postviews>
  </post>
  <post id="22640">
    <postviews>72</postviews>
  </post>
  <post id="22227">
    <postviews>1</postviews>
  </post>
...etc etc
</posts>

我想找到前 10 个最高的 postview 值,然后获取父节点 post id,所以我基本上拥有前 10 个 postview 的 id。

我不知道该怎么做,有人可以帮忙吗?如果我通过...加载 XML 文件是否已经是一个数组?</p>

$xml = simplexml_load_file($xmlFile);

谢谢,詹姆斯

4

2 回答 2

3

可以通过将每个postSimpleXML 元素添加到数组中来完成,然后使用以下命令对该数组进行排序usort()

function cmp($a, $b){
    if ((int)$a->postviews[0] == (int)$b->postviews[0]) {
        return 0;
    }
    return ((int)$a->postviews[0] > (int)$b->postviews[0]) ? -1 : 1;
}

$xml = simplexml_load_string($xmlStr);

$posts = array();

foreach($xml->post as $p)
{
    $posts[] = $p;
}

usort($posts, "cmp");

// $posts is now sorted by the views

// output them
foreach($posts as $post)
{
  echo "Post ID " . $post->attributes()->id . " has " . (int)$post->postviews . " views\n";
}

如果您只想要前 10 个,那么只需使用for循环或添加检查以在前 10 个之后停止循环,或者您可以unset()在前 10 个之后的所有内容。

输出

帖子 ID 22640 有 72 次浏览
帖子 ID 22359 有 31 次浏览
帖子 ID 20595 有 3 次浏览
帖子 ID 22227 有 1 次浏览
帖子 ID 20963 有 1 次浏览

键盘演示

于 2012-11-22T16:53:48.140 回答
0

编辑:大声笑,您可能想使用 MrCode 的示例而不是我的示例。我完全忘记了 XML 是单独解释的。

好吧,我对 XML 没有任何经验。但无论如何,我会尽力提供帮助。不确定您想如何读取 XML 文件,但我将在此处使用 fgets():

$file_handle = fopen($xmlFile, "r");
$i = 1;
while ($i <= 31) { //We have the inital declaration, then 3 lines per read. 31.
while (!feof($file_handle)) {
   $line = fgets($file_handle);
   echo $line;
$i++;
}
}
fclose($file_handle);

这有帮助吗?

于 2012-11-22T16:43:00.760 回答