4

我有 2 个表:dt_timesdt_reports

dt_times包含时间列表,dt_reports包含对相关时间的投票(正/负)。

我的代码执行以下操作:

  • 选择今天之前的所有时间
  • 对于这些时间中的每一个 - 计算保证金((positive-negative)/positive)*100
  • 结果存储在数组中

在所有迭代之后,这里是 id => margin 的 var_dump

array(8) {

    [111]=> int(100)
    [110]=> int(-100)
    [108]=> int(-100)
    [100]=> int(100)
    [97]=> int(100)
    [92]=> int(100)
    [59]=> float(-71.4285714286)
    [58]=> float(-50)

 }

我需要选择最高边距,其中 id 也是最高的。因为您可以看到 111、100、97 和 92 - 都具有相同的 100 值。

到目前为止,我的代码是这样的:

while ($row = mysql_fetch_array($result)) {

    //Get values for quality
    //calculate margin
    $arr[$row['id']] = $margin;
    $arr2[$margin] = $row['id'];

}

$timeId = $arr2[max($arr)];

但是,在所有循环之后,$timeId 是 92,这是数组中值为 100 的最后一个 id

我认为 array_keys 可能是答案,但为了我生命中的热爱,我无法弄清楚它们 =(

4

3 回答 3

3

使用 krsort 按键对结果数组进行排序 - http://us.php.net/manual/en/function.krsort.php。它将返回具有最高值的最高键作为第一个元素。

  <?php
   $a = array(10 => 10, 20=>10, 20=>20);
   krsort($a);
   var_dump($a);

  ?>
于 2012-10-09T15:09:25.577 回答
1

从检索数组http://us.php.net/manual/en/function.max.php的最大值开始,然后遍历数组并找到与最大值匹配的边距的键。

$arr = array();
while ($row = mysql_fetch_array($result)) {
    //Get values for quality
    //calculate margin
    $arr[$row['id']] = $margin;
}

$max = max($arr);
$highestId = 0;
foreach($arr as $id => $margin){
  if($margin == $max && $id > $highestId){
    $highestId = $id;
  }
}
于 2012-10-09T15:28:57.290 回答
1

您可以通过创建一个合适的数组与usort()自定义比较函数一起使用来做到这一点,代码如下:

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

while ($row = mysql_fetch_array($result)) {
    //calculate $margin
    //...
    $arr[] = array('margin'=>$margin ,'id'=>$row['id']);
}

usort($arr, 'cmp');

echo 'The highest id with the highest margin is';
echo ' ID: ' . $arr[0]['id'] . ' MARGIN: ' . $arr[0]['margin'];

//Print full sorted classification
foreach($arr as $val) {
   echo 'ID:' . $val['id'] . ' MARG: ' . $val['margin'] . '<br>';
}

此解决方案将按$arrid 排序,边距从高到低,因此第一项$arr[0]是最高的 id 和边距,您可以循环数组的其余部分以打印完整的排序表,而不仅仅是最高的项目。

于 2012-10-09T15:33:13.270 回答