我希望这不是一个重复的问题;我找了也没用。。。
我正在尝试对搜索返回的对象数组进行排序。我想对结果进行如下排序:如果对象的"name"属性与搜索查询匹配,则将其放在顶部。接下来,如果"city"属性与查询匹配,则将它们放在下一个。(我打算稍后添加更多条件。)因此,我不是严格比较值,而是将每个对象$a
与搜索查询$q
进行比较。数组确实正在重新索引,但不是按照我期望的顺序。我错过了什么?
function cmp($a, $b) {
global $q; // search query
$query = strtolower($q);
$name = strtolower($a->getName()); // defined in class
$city = strtolower($a->getCity()); // defined in class
if ($name == $query) {
return -1;
}
elseif ($city == $query) {
return -1;
}
return 0;
}
usort($cinemas, 'cmp'); // $cinemas is an array of objects
您需要比较比较函数中的两个项目,并返回哪个项目更大。目前,您完全忽略了传入的第二个项目$b
。您的逻辑需要按照以下顺序:
- 如果a和b的名称都与查询匹配,则它们相等
- 如果a的名称与查询匹配,则其值更大
- 如果b的名称与查询匹配,则其值更大
- 如果a和b的城市都与查询匹配,则它们相等
- 如果a的城市与查询匹配,则其值更大
- 如果b的城市与查询匹配,则较大
- 如果a的名称和b的名称不相等,则返回两者的
strcmp
值 - 返回a所在城市和b所在城市的
strcmp
值
您应该使用一个匿名函数:
usort($cinemas, function($a, $b) use ($q) {
$query = strtolower($q);
$name = strtolower($a->getName()); // defined in class
$city = strtolower($a->getCity()); // defined in class
// do the comparison
});
请注意,$q
已导入到函数的作用域中,因此不需要global
。
除此之外,函数应该返回1
、0
或-1
,正如在对该问题的评论中所提到的那样。