为什么我的usort()输出没有排序?

时间:2014-08-15 11:14:06

标签: php usort

我正在重写使用usort吐出最受欢迎内容的旧脚本。

出于某种原因,我的usort输出实际上并没有排序。

我使用的是PHP 5.5(请忽略使用折旧的mysql_函数,这是我重写此脚本的部分原因)。

    //store data in array
    $sort_array = array();
    while($row = mysql_fetch_assoc($result)) {
        //calculate age
        $age = (strtotime("now") - strtotime($row["DATE"]))/86400;//86400 converts seconds to days
        //calculate "effective views" via gaussian distribution shown below 
        //y = e^(-(k * x)^2) where k is below
        $K = 0.1665109222315395512706329289790402095261177704528881;//solved for a half-life of 5 days
        $effective_views = round($row["VIEWS"] * exp(-pow( $K * $age, 2)));

        //store data
        $article = new stdClass;
        //$article->id = $row["ID"];
        $article->effective_views = $effective_views;
        //$article->title = $row["TITLE"];
        //$article->author = $row["AUTHOR"];
        $sort_array[] = $article;
    }

    //sort array based on effective views
    usort(
        $sort_array, 
        function($a, $b) {
            return -strcmp($a->effective_views, $b->effective_views);
        }
    );
    echo "<pre>";
    print_r($sort_array);

输出应按降序排列在effective_views上,但不是。

这是一个输出转储:

http://pastebin.com/rV5YwWN7

请告诉我这里的错误。

4 个答案:

答案 0 :(得分:3)

您不应使用strcmp来比较整数。

您应该使用:

return $a->effective_views - $b->effective_views;

而不是

return -strcmp($a->effective_views, $b->effective_views);

您还可以查看以下结果:

echo strcmp(2,10);

如您所见,1而非-1,因为10字符串中的第一个字符为11位于2之前

答案 1 :(得分:3)

问题是使用strcmp来比较数字;它以lexicographical方式比较字符串,或者在字典中找到&#34;&#34;。这使得&#34; 96&#34;在&#34; 503&#34;之后,或在反向订购之前。

考虑以下情况,当&lt;时,返回负数。 b,当a> 1时为正数。 b,否则为0 - 当与使用欧式比较函数一起使用时,它有效地反转订单号。

return $a->effective_views - $b->effective_views;

答案 2 :(得分:2)

您正在使用strcmp看似整数,请尝试return $a->effective_views - $b->effective_views或其他方式,具体取决于您的订购。

simple sandbox表示strcmp以字典方式工作。

答案 3 :(得分:0)

Strcmp - 二进制安全字符串比较

你不能像这样使用strcmp因为它不是要比较数字,如果你想用strcmp比较数字你可以使用这样的小技巧:

function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a > $b) ? -1 : 1;
}

$a = array(3, 7, 733, 9, 73, 222, 5, 99, 1, 5, 0);
usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}

如果您想使用Comparison Operators

function cmp2($a, $b) {
    if(strlen($a)!==strlen($b)){
    return -strcmp(strlen($a),strlen($b));
    }
    return -strcmp($a, $b);
}

$a = array(3, 7, 733, 9, 73, 222, 5, 99, 1, 5, 0);
usort($a, "cmp2");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}

示例:http://sandbox.onlinephpfunctions.com/