PHP 从数组中获取最高值(来自 SQL 选择)
Posted
技术标签:
【中文标题】PHP 从数组中获取最高值(来自 SQL 选择)【英文标题】:PHP Getting highest value from array (from SQL select) 【发布时间】:2012-09-29 22:58:39 【问题描述】:我有 2 个表:dt_times 和 dt_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 => 100, 11=>70, 15 => 100, 13=>100 );
var_dump 返回array(4) [15]=> int(100) [13]=> int(100) [12]=> int(100) [11]=> 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 选择)的主要内容,如果未能解决你的问题,请参考以下文章
如果用户 selected_city 也将来自未从 CITY MODEL 选择的城市,如何从用户已经选择的城市键的数组中获取结果