PHP针对外部变量启动对象数组


PHP usort Array of Objects Against External Variable

我希望这不是一个重复的问题;我找了也没用。。。

我正在尝试对搜索返回的对象数组进行排序。我想对结果进行如下排序:如果对象的"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。您的逻辑需要按照以下顺序:

  1. 如果a和b的名称都与查询匹配,则它们相等
  2. 如果a的名称与查询匹配,则其值更大
  3. 如果b的名称与查询匹配,则其值更大
  4. 如果a和b的城市都与查询匹配,则它们相等
  5. 如果a的城市与查询匹配,则其值更大
  6. 如果b的城市与查询匹配,则较大
  7. 如果a的名称和b的名称不相等,则返回两者的strcmp
  8. 返回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

除此之外,函数应该返回10-1,正如在对该问题的评论中所提到的那样。