PHP 从数组中获取最高值(来自 SQL 选择)

Posted

技术标签:

【中文标题】PHP 从数组中获取最高值(来自 SQL 选择)【英文标题】:PHP Getting highest value from array (from SQL select) 【发布时间】: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 可能是答案,但为了我一生的挚爱,我无法弄清楚它们 =(

【问题讨论】:

为什么不从循环中的键和值中获取平均值? 您也可以发布您的查询吗?也许您应该更愿意让数据库为您完成工作。 您可以通过更改查询来实现它。 【参考方案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和边距,你可以循环数组的其余部分来打印完整的排序表,而不仅仅是最高的项目。

【讨论】:

不会说谎,这是我最长且最不了解的解决方案,但它工作得非常完美,并为我提供了我需要的所有数据以及更多!谢谢!

以上是关于PHP 从数组中获取最高值(来自 SQL 选择)的主要内容,如果未能解决你的问题,请参考以下文章

PHP/SQL 从 SQL 表中获取正确的数组

从 SQL 单行中选择并设置为 php 数组 [重复]

Presto Sql:如何选择数组中排名最高的值

如何在 PHP 登录脚本中验证来自 SQL 的串联?

javascript 从数组中获取最高值

如果用户 selected_city 也将来自未从 CITY MODEL 选择的城市,如何从用户已经选择的城市键的数组中获取结果