我正在重写使用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上,但不是。
这是一个输出转储:
请告诉我这里的错误。
答案 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
字符串中的第一个字符为1
且1
位于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";
}