【问题标题】:Getting PHP Warning array_sum() expects parameter 1 to be array, object given?获取 PHP 警告 array_sum() 期望参数 1 是数组,给定对象?
【发布时间】:2017-06-21 23:50:37
【问题描述】:

只是想得到一个查询结果的总和,我得到:

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() 循环会更有效。

【问题讨论】:

  • $stmtmysqli_result,而不是数组。
  • 你为什么用 PHP 计算平均值?在 SQL 中使用 SELECT AVG(time)
  • 不是mysqli_fetch_result()之后的数组吗?
  • 我不知道我可以在 SQL 中做到这一点!这可能是一个更好的选择!
  • 没有mysqli_fetch_result()这样的功能。

标签: php mysql arrays mysqli


【解决方案1】:

$stmtmysqli_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);
}

【讨论】:

  • 我喜欢你的推荐。这个呢?:SELECT AVG(time) AS avgtime FROM admin_performance ORDER BY id DESC $limit
  • 那行不通。 LIMIT 适用于计算平均值之后的结果,它只有一行。它不适用于计算平均值时使用的行。
  • 这就是为什么ORDER BYLIMIT 必须在子查询中完成。
  • 哦,我明白了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2018-07-23
  • 2011-09-04
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多