PHP usort针对外部变量的对象数组

时间:2014-09-03 18:37:02

标签: php object usort

我希望这不是一个重复的问题;我搜索无济于事......

我正在尝试对搜索返回的对象数组进行排序。我想按如下方式对结果进行排序:如果对象的“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

2 个答案:

答案 0 :(得分:1)

您需要在比较函数中比较两个项目并返回哪一个。目前,您完全无视传入的第二个项目$b。您的逻辑需要按以下顺序:

  1. 如果一个&b和s的名称与查询相匹配,则它们相等
  2. 如果名称与查询匹配,则为更大
  3. 如果b的名称与查询匹配,则为更大
  4. 如果某个城市和b城市都与该查询匹配,则他们相等
  5. 如果某个城市与该查询匹配,那就更大
  6. 如果b' s城市与查询匹配,则更大
  7. 如果姓名和b的名称不相等,则返回两者的strcmp
  8. 返回某个城市和b城市的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

除此之外,该函数应返回10-1,正如问题评论中所述。