我希望这不是一个重复的问题;我搜索无济于事......
我正在尝试对搜索返回的对象数组进行排序。我想按如下方式对结果进行排序:如果对象的“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
答案 0 :(得分:1)
您需要在比较函数中比较两个项目并返回哪一个。目前,您完全无视传入的第二个项目$b
。您的逻辑需要按以下顺序:
strcmp
值strcmp
值答案 1 :(得分:0)
您应该使用anonymous function:
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
,正如问题评论中所述。