尝试获取查询结果的总和,我得到:
array_sum()期望参数1是数组,给定对象
使用代码:
function getPerformance($limit, $mysqli) {
if (is_numeric($limit)) {
$limit = 'LIMIT '.$limit;
} else {
$limit = NULL;
}
if ($stmt = $mysqli->query("SELECT time FROM admin_performance ORDER BY id DESC $limit")) {
$average = array_sum($stmt) / count($stmt);
$average = number_format(($average*1000),2,'.',',');
} else {
$average = 'Error';
}
return $average;
}
我还尝试在查询之后使用$ array = mysqli_fetch_array($ stmt)并将array_sum($ stmt)更改为array_sum($ array)并得到相同的东西。
我解决了这个问题:
function getPerformance($limit, $mysqli) {
if (is_numeric($limit)) {
$limit = 'LIMIT '.$limit;
} else {
$limit = NULL;
}
if ($stmt = $mysqli->query("SELECT time FROM admin_performance ORDER BY id DESC $limit")) {
$rows = mysqli_num_rows($stmt);
$sum = 0;
while ($array = mysqli_fetch_array($stmt)) {
$sum += $array['time'];
}
$average = $sum/$rows;
$average = number_format(($average*1000),2,'.',',');
} else {
$average = 'Error';
}
return $average;
}
但是我做错了什么?我认为没有while()循环会更有效率。
答案 0 :(得分:0)
$stmt
是mysqli_result
,而不是查询中的值数组。您必须调用fetch函数来获取值。而fetch函数一次只返回一行,而不是所有结果的数组。
如果您有MYSQLND驱动程序,则可以使用$stmt->fetch_all()
。这将返回一个二维数组 - 数组的每一行都是结果的一行。您不能在此使用array_sum()
,因为它需要值的一维数组。但是你可以使用array_column()
返回一个特定列的数组,然后加上它。
$rows = $stmt->fetch_all();
$average = array_sum(array_column($rows, 'time')) / count($rows);
但更有效的方法是计算SQL中的平均值。
if ($stmt = $mysqli->query("SELECT AVG(time) AS avgtime FROM (SELECT time FROM admin_performance ORDER BY id DESC $limit) AS x")) {
$row = $stmt->fetch_assoc();
$average = $row['avgtime'];
} else {
die($mysqli->error);
}