2

我已经在这个网站和其他网站上搜索了两个多小时的答案,但找不到似乎有效的排序功能。

这是我的代码:

<?php
{

    $ratingsArrayCounter = 0;
    $nrows = mysql_num_rows($result);
    $ratingsArray = array();

    if ($nrows > 0){
        for ($i=0; $i < $nrows; $i++) {

            $row = mysql_fetch_object($result);
            $ratingsArray[$i]->autoID=$row->autoID;
            $ratingsArray[$i]->awareness=$row->awareness;
            $ratingsArray[$i]->performance=$row->performance;
            $ratingsArray[$i]->attendance=$row->attendance;
            $ratingsArray[$i]->attention=$row->attention;
            $ratingsArray[$i]->knowledge=$row->knowledge;

            $ratingsArray[$i]->ratingsAverage = rand(0, 100);
            $ratingsArrayCounter++;
        }
    }

function sortByOrder($a, $b) {
    return $a['ratingsAverage'] - $b['ratingsAverage'];
}

usort($ratingsArray, 'sortByOrder')
?>

输出未排序。

提前致谢!

4

3 回答 3

4

坏的

function sortByOrder($a, $b) {
    return $a['ratingsAverage'] - $b['ratingsAverage'];
}

好的

function sortByOrder($a, $b) {
    return $a->ratingsAverage - $b->ratingsAverage;
}

PS 如果您在尝试使用数组等对象时没有看到错误,请打开/打开错误报告并确保显示错误(如果您不确定如何搜索,则超出此问题的范围)。


编辑浮动,使用更常见的回调if-elseif-else模式。无法使用usort()该示例,因为该函数必须返回一个整数。a - b

手册页中usort()所述:

如果认为第一个参数分别小于、等于或大于第二个参数,则比较函数必须返回一个小于、等于或大于零的整数。

function sortByOrder($a, $b) {
    if ($a->ratingsAverage > $b->ratingsAverage) {
        return 1;
    } elseif ($a->ratingsAverage < $b->ratingsAverage) {
        return -1;
    } else {
        return 0;
    }
}
于 2013-06-06T21:58:18.043 回答
0

尽管直接在数据库中对其进行排序应该是首选解决方案,但另一个基于 php 的解决方案将创建另一个数组,将每个$ratingsArray成员索引直接映射到其raitingsAverage,对该数组进行排序并使用新的键顺序来访问$ratingsArray. 这是一些示例代码:

<?php
{

    $ratingsArrayCounter = 0;
    $nrows = mysql_num_rows($result);
    $ratingsArray = array();
    $sortingHelper = array();

    if ($nrows > 0){
        for ($i=0; $i < $nrows; $i++) {

            $row = mysql_fetch_object($result);
            $ratingsArray[$i]->autoID=$row->autoID;
            $ratingsArray[$i]->awareness=$row->awareness;
            $ratingsArray[$i]->performance=$row->performance;
            $ratingsArray[$i]->attendance=$row->attendance;
            $ratingsArray[$i]->attention=$row->attention;
            $ratingsArray[$i]->knowledge=$row->knowledge;

            $ratingsArray[$i]->ratingsAverage = rand(0, 100);
            $sortingHelper[$i] = $ratingsArray[$i]->ratingsAverage;
            $ratingsArrayCounter++;
        }
    }

    asort($sortingHelper);
    $sortedKeys = array_keys($sortingHelper);

    // To access the sorted version of the $ratingsArray,
    // you would then do something like this:
    echo($ratingsArray[$sortedKeys[$i]]->knowledge);

    // If you really need the sorted array, you could
    // also do something like this:
    $sortedRatingsArray = array();
    foreach($sortedKeys as $key) {
        $sortedRatingsArray[] = $ratingsArray[$key];
    }
?>
于 2013-06-06T23:44:19.240 回答
0

即使我的回答被接受了,这个答案更好:https ://stackoverflow.com/a/16972904/1560865


usort这是文档中的引用:

警告

从比较函数返回非整数值,例如浮点数,将导致内部强制转换为回调返回值的整数。因此,诸如 0.99 和 0.1 之类的值都将被转换为整数值 0,这将比较这些值是否相等。

因此:如果您对仅在小数点后 5 位之后不同的行的正确顺序不是特别感兴趣ratingsAverage,那么一个快速而简单的解决方案可能是这样的:

function sortByOrder($a, $b) {
    return ($a->ratingsAverage - $b->ratingsAverage) * 10000;
}
于 2013-06-06T23:32:13.263 回答