使用带有排序和数组的中位函数

时间:2013-02-19 14:59:24

标签: php mysql

我正在尝试计算数组的中位数。我能够得到MIN,MAX,AVG,但是我对中位数和显示器对信息的排序方式有困难。

我的问题是如何获得中位数,为每个状态单独使用一个函数。 (状态为A,C,E,L,P,W)

我的代码是:

<?php
echo "<p><b>A</b> = Active, <b>E</b> = Expired, <b>L</b> = Canceled, <b>P</b> = Pending, <b>W</b> = Withdrawn</p>\n";
// COUNT STATUS
include '_inc/include.php';
$query = "SELECT status, COUNT(status) FROM median GROUP BY status"; 

$result = mysql_query($query) or die(mysql_error());

// Print out result
while($row = mysql_fetch_array($result)){
echo "There are ". $row['COUNT(status)'] ." ". $row['status'] ." items.";
echo "<br />";
}
?>

显示为:

A =有效,C =已结,E =已过期,L =已取消,P =待定,W =已撤回

有6件物品

有2个C项

有9件E物品

有4个L项目

有2个P项目

我的代码是:     

$query = "SELECT listprice, status, MIN(listprice), COUNT(status) FROM median GROUP BY status"; 

$result = mysql_query($query) or die(mysql_error());

// Print out result
while($row = mysql_fetch_array($result)){
echo "The MIN list price for the  ". $row['COUNT(status)'] ." ". $row['status'] ." is $" .    $row['MIN(listprice)'];
echo "<br />";
}
?>

显示为:

6 A的MIN清单价格为$ 139900.00

2 C的MIN清单价格是$ 149900.00

9 E的MIN清单价格为$ 138000.00

4 L的MIN清单价格为$ 229000.00

2 P的MIN清单价格为$ 179000.00

MAX和AVG与上述类似。

我试图包含一个计算中位数(MED)的函数

<?php
function median($arr)
{
sort($arr);
$count = count($arr); //count the number of values in array
$middleval = floor(($count-1)/2); // find the middle value, or the lowest middle value
if ($count % 2) { // odd number, middle is the median
    $median = $arr[$middleval];
} else { // even number, calculate avg of 2 medians
    $low = $arr[$middleval];
    $high = $arr[$middleval+1];
    $median = (($low+$high)/2);
}
return $median;
}

echo median(array($lp)) . "\n";  // 153500
echo "<p> </p>";
echo median(array(4.1, 7.2, 1.7, 9.3, 4.4, 3.2)) . "\n";       // 4.25

?>

这适用于静态数组,但如何计算它看起来像上面的MIN,MAX?

<?php
$i=0;
while ($i < $num) {

$ld=mysql_result($result,$i,"listdate");
$cd=mysql_result($result,$i,"closedate");
$contractd=mysql_result($result,$i,"contractdate");
$s=mysql_result($result,$i,"status");
$scd=mysql_result($result,$i,"statuschangedate");
$wd=mysql_result($result,$i,"withdrawdate");
$cand=mysql_result($result,$i,"canceldate");
$lp=mysql_result($result,$i, "listprice");
$sp=mysql_result($result,$i,"soldprice");
$gla=mysql_result($result,$i,"gla");
$b=mysql_result($result,$i,"built");
$o=mysql_result($result,$i,"owner");
$fs=mysql_result($result,$i,"fore");
$ss=mysql_result($result,$i,"shortsale");
$f=mysql_result($result,$i,"features");
?>

我想也许我遇到这么多麻烦的原因是表中的数据是通过文件上传(csv)上传的。但我并不认为这与它有任何关系,因为数据已经存在。

我使用$ lp代替listprice代替中位函数中的静态数组,即它是空白的。

2 个答案:

答案 0 :(得分:1)

  

......这就是空白。

空白页表示抛出PHP错误但关闭了错误显示设置。请务必turn on error reporting查看问题。

有一点很重要,不推荐使用的mysql_result()函数将从MySQL结果集中检索一个单元格的内容。如果您希望通过传递中位数函数array($lp)来获得多个值,则不会发生这种情况。此外,如果mysql_result()函数失败或找不到结果,则返回false表示传递给中值函数的数组现在为array(false)

在进行故障排除时,请注意以下事项。打开错误报告,这个问题应该更容易推断出来。

答案 1 :(得分:0)

大多数MySQL版本没有median函数。但是,MariaDB 10.3.3刚刚引入了median function