php SimpleXML排序数据键和值。需要找到前10个值

时间:2012-11-22 16:34:12

标签: php xml multidimensional-array simplexml

我有一个XML文件,其中包含以下数据......

<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值,然后获取父节点的帖子ID,所以我基本上拥有前10个帖子的ID。

我不知道如何解决这个问题,任何人都可以帮忙吗?如果我通过...

加载它,那么XML文件是否已经是一个数组
$xml = simplexml_load_file($xmlFile);

谢谢,詹姆斯

2 个答案:

答案 0 :(得分:3)

可以通过将每个post SimpleXML元素添加到数组,然后使用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个视图

<强> Codepad Demo

答案 1 :(得分:0)

编辑:lol,你可能想要使用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);

这有帮助吗?