Foreach排序

时间:2012-10-23 12:51:45

标签: php api sorting

我不太确定这是否可行,但无论如何我都会尝试解释,

我们正在尝试为公会制作一个页面,我们希望它显示平均项目级别及其名称。

Name | iLvL 
Bob    262
Sam    159

我们目前正在运行一个执行以下操作的脚本:

$members = $guild->getMembers();

这基本上得到了我们公会中所有成员的列表 - 然后我们用foreach循环迭代并再次调用以获取信息

//Character Arrays
foreach($members as $member) {

//Get character information
$mrank = $member['rank'];
$mname = $member['character']['name'];
$mgender = $member['character']['gender'];
$mlevel = $member['character']['level'];
$mrace = $member['character']['race'];
$character = $armory->getCharacter($mname);
$gear = $character->getGear();
$milevel = $gear['averageItemLevelEquipped'];
echo '<td><div align="center" class="style1">'. $mname .'</div></td>';
echo '<td><div align="center" class="style1">'. $milevel .'</div></td> ';

唯一的问题是因为我们迭代它们单数我不太确定如何将平均物品等级从最高到最低排序 - 我听说像rsort这样的东西但我似乎无法让它工作和我想知道是否有人能够伸出援助之手。

由于

4 个答案:

答案 0 :(得分:2)

您可以在SQL查询中对成员进行排序。 如果要排序结果数组,请使用uasort:http://www.php.net/manual/en/function.uasort.php

答案 1 :(得分:2)

$members = $guild->getMembers();

创建另一种方法;

$members = $guild->getMembersByiLvL();

将行ORDER BY iLvL DESC添加到sql查询中。

由于你没有展示$ guild是一个对象的类,我不能说这样做是多么容易 - 但这似乎是一个更好的手段。

然后你可以继续开发这种方法:

$members = $guild->getMembersSorted('iLvL');

编辑:我假设您的数据来自Mysql数据库,所以当然可能是错误的......

答案 2 :(得分:2)

我建议用你在那里的数据创建一个数组,每个人都有一个子数组。还要创建一个仅由averageItemLevelEquipped值组成的数组,然后在runnning array_multisort时将其用作索引数组。它看起来像这样:

$resourcearray = array();
$indexarray = array();

foreach($members as $member) {
    //Get character information
    $mrank = $member['rank'];
    $mname = $member['character']['name'];
    $milevel = $gear['averageItemLevelEquipped'];
    //and anything else you want to add goes here, of course
    array_push($resourcearray, array('rank' => $mrank, 'charname' => $mname, 'itemlevel' => $milevel));
    array_push($indexarray, $milevel);
}

array_multisort($indexarray, $resourcearray);

foreach($resourcearray as $resource) {
    echo '<td><div align="center" class="style1">'. $resource['charname'] .'</div></td>';
    echo '<td><div align="center" class="style1">'. $resource['itemlevel'] .'</div></td> ';
}

答案 3 :(得分:2)

foreach遍历输入数组而不对订单进行任何修改。 所以你需要在foreach之前对输入进行排序或者对foreach迭代的结果进行排序。

通常最好在输入foreach之前对输入进行排序,方法是

  1. 从数据库中提取数据(SQL ORDER BY子句)
  2. 对数据进行排序
  3. 对要迭代的数组(或类似数组的对象)进行排序
  4. for 2,PHP中的数组有很多排序函数(看看php.net/manual/en/ref.array.php)。例如,你可以像这样使用usort

    function cmp($a, $b)
    {
      if ($a['character']['level'] == $b['character']['level']) {
        return 0;
      }
      return ($a['character']['level'] < $b['character']['level']) ? -1 : 1;
    }
    $members = $guild->getMembers();
    
    usort($members, 'cmp');
    
    foreach ($members as $member) {
      //..
    }
    

    如果您有权访问数据库查询并且通常需要以这种方式排序的数据,那么在SQL中使用数据库端排序会更好(性能更好,可读性更好)。