3

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

我们正在尝试为我们的公会创建一个页面,我们希望它显示平均装备等级以及他们的名字,例如

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

4 回答 4

2

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

于 2012-10-23T12:59:30.310 回答
2
$members = $guild->getMembers();

创建另一个方法;

$members = $guild->getMembersByiLvL();

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

由于您没有显示 $guild 是对象的类,因此我不能说这样做有多么容易-但这似乎是一种更可取的方法。

然后,您可以继续开发该方法来执行此操作:

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

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

于 2012-10-23T12:59:41.540 回答
2

我建议从那里的数据中创建一个数组,每个人都有一个子数组。还创建一个仅包含 averageItemLevelEquipped 值的数组,然后在运行时将其用作索引数组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> ';
}
于 2012-10-23T13:00:45.323 回答
2

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

通常最好在输入之前对输入进行排序foreach,或者通过

  1. 从数据库中提取数据时对数据进行排序(SQLORDER BY子句)
  2. 对要迭代的数组(或类似数组的对象)进行排序

对于 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 中的数据库端排序(更好的性能,更好的可读性)。

于 2012-10-23T13:16:10.367 回答