2014-09-03 32 views
0

我希望這不是一個重複的問題;我已經搜索無濟於事...PHP usort針對外部變量的對象數組

我想排序搜索返回的對象數組。我想按以下方式對結果進行排序:如果對象的「name」屬性與搜索查詢匹配,請將其放在頂部。接下來,如果「城市」屬性與查詢匹配,請將其放在下面。 (我打算稍後添加更多標準。)所以我並不嚴格比較值,而是將每個對象$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

的CMP函數返回** 3 **東西的strcmp值:少(-1),等於(0),大於(+1)。你只返回兩個東西:-1和0 – 2014-09-03 18:40:41

+0

嗯...我試着添加另一個elseif返回1,但結果仍然以相同的方式排列(匹配城市不在頂部)。 – 2014-09-03 18:56:01

+0

請給我一個你的'搜索查詢'數組的例子。即數組('名稱'=>'弗雷德','城市'=>'mycity')或者它是不同的格式?一些樣本數據和預期結果可能有用。您的評論「匹配的城市不在頂部」 - 我不確定這是怎麼回事。 – 2014-09-03 19:01:10

回答

1

您需要比較兩項在您的比較功能並返回哪一個更大。目前,你完全忽略了第二件物品被傳入,$b。你的邏輯必須按此順序:

  1. 如果a和b的名稱相匹配的查詢,他們是平等的
  2. 如果一個名稱的查詢相匹配,這是更大的
  3. 如果B的名稱相匹配查詢時,它大於
  4. 如果a和b的城市符合查詢條件,他們是平等的
  5. 如果所在的城市的查詢相匹配,這是更大的
  6. 如果b的城市查詢相匹配,這是更大的
  7. 如果姓名和b的名字是不相等的,返回的兩個
  8. strcmp值返回的城市和b的城市
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,如問題的評論中所述。

+0

'usort'函數需要返回**'3'**值中的一個:-1爲'小於',+1爲'大於';零等於'等於'。 – 2014-09-03 20:25:01

+0

謝謝,修復。 (雖然實際上'-1'和'1'通常就足夠了。) – lxg 2014-09-03 21:27:07