【问题标题】:PHP Getting highest value from array (from SQL select)PHP 从数组中获取最高值(来自 SQL 选择)
【发布时间】:2012-09-29 22:58:39
【问题描述】:

我有 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 可能是答案,但为了我一生的挚爱,我无法弄清楚它们 =(

【问题讨论】:

  • 为什么不从循环中的键和值中获取平均值?
  • 您也可以发布您的查询吗?也许您应该更愿意让数据库为您完成工作。
  • 您可以通过更改查询来实现它。

标签: php arrays while-loop


【解决方案1】:

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

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

  ?>

【讨论】:

  • 这行不通,数组失败了(10 => 10, 20=>10, 20=>20, 20=>30, 20=>25)
  • @Nelson :只需简单地尝试 var_dump 您提供的数组。我们如何将多个值存储到同一个键中?
  • 嗯,在那种情况下你是对的。我认为它可能存在相同的 ID。
  • @janenz00 愚蠢的问题:$a = array(12 =&gt; 100, 11=&gt;70, 15 =&gt; 100, 13=&gt;100 ); var_dump 返回array(4) { [15]=&gt; int(100) [13]=&gt; int(100) [12]=&gt; int(100) [11]=&gt; int(70) } - 我只需要第一个 [15] id 及其值 - 我怎样才能得到它们,所以我可以在我的 sql 中使用它们声明?
  • 忽略我之前的评论。看来$newArray = array_keys($a); echo $newArray[0]; 有效!我还弄清楚了你的解决方案是如何工作的,所以它实际上似乎是正确的答案!
【解决方案2】:

从检索数组 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;
  }
}

【讨论】:

    【解决方案3】:

    你可以通过创建一个合适的数组来使用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>';
    }
    

    这个解决方案会给你$arr按id排序,边距从高到低,所以第一项$arr[0]是最高的id和边距,你可以循环数组的其余部分来打印完整的排序表,而不仅仅是最高的项目。

    【讨论】:

    • 不会说谎,这是我最长且最不了解的解决方案,但它工作得非常完美,并为我提供了我需要的所有数据以及更多!谢谢!
    猜你喜欢
    • 2014-02-24
    • 2015-03-24
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多