賽規:
聯賽兩個循環後積分最高之球隊為總冠軍,如有同分,則先以雙方對賽成績計算勝負(即兩勝對手或一勝一和);但雙方如各勝一場或兩場都賽和而未能分出高下,則以得失球差計算,多者為冠軍;如得失球差相同,則以入球較多者為冠軍;如入球數字亦相同,則須安排一場附加賽決定名次。
依照如上賽規進行排序的話,將無法使用PHP的array_multisort函數,因為其中第二項條件不是一個簡單的數據列,而是涉及到再次進行複雜的數據庫查詢。
所以只有第一次排序可以使用:
foreach($results as $res)
{
$field[] = $res['points'];
}
array_multisort($field, SORT_DESC, $results);
由此得到一個根據‘積分’排序后的數組,之後的排序,需要通過自定義冒泡排序來完成。
1.首先判斷是否積分字段有重複
積分重複標誌=否
從 n 到 1
{
(判斷第n個與第n-1個的積分是否相同)
相同:{積分重複標誌=是;終止循環}
不相同:{}
}
如果沒有重複,表明不需要再進行任何進一步的排序操作,排序工作至此完成。
如果有重複,則通過冒泡排序:
勝負重複標誌=否
指數 i 從 第n個 開始 到 第1個 結束
{
指數 j 從第n個 開始, 到第n-i個 結束
{
(判斷是否第j個與第j-1個的‘積分’相同)
相同:
{
查詢數據庫中兩個球隊比賽情況;
(判斷是否兩支球隊排名應相同)
不相同:{調轉兩個球隊次序或不調轉}
相同:{給兩支球隊的‘勝負’字段賦值j,如果第j球隊已經擁有此‘勝負’字段並且有值x,那麼兩球隊都被賦值x;
設定 勝負重複標誌=是}
}
不相同:
{
}
}
如果‘勝負重複標誌’仍為否,則終止循環
}
這樣,將會得到一個排序后的數組,該數組中,若兩個相鄰的元素的‘勝負’字段都有被賦值,並且相同,那麼這指示著應該要對它們進行進一步的排序,即根據‘得失球差’字段。
在進行根據‘得失球差’字段排序之前,可以先通過上一次冒泡排序中使用的‘勝負重複標誌’來判斷是否需要執行此操作,如果該變量的值為‘否’,那麼說明並未遇見相鄰的元素有相同‘勝負’值,即表示不需要執行進一步排序。
之後的冒泡排序都是普通的冒泡排序。如果 ‘勝負重複標誌’為 ‘是’,根據‘得失球差’排序:
得失球差重複標誌=否
指數 i 從 第n個 開始 到 第1個 結束
{
指數 j 從第n個 開始, 到第n-i個 結束
{
(判斷是否第j個與第j-1個的‘積分’相同 並且 ‘勝負’相同)
相同:
{
(判斷是否兩支球隊‘得失球差’相同)
不相同:{調轉兩個球隊次序或者不調轉}
相同:{ 設定 得失球差重複標誌=是}
}
不相同:
{
}
}
如果‘得失球差重複標誌’仍為否,則終止循環
}
如果 ‘得失球差重複標誌’為 ‘是’,根據‘得球’排序:
得球重複標誌=否
指數 i 從 第n個 開始 到 第1個 結束
{
指數 j 從第n個 開始, 到第n-i個 結束
{
(判斷是否第j個與第j-1個的‘積分’相同 並且 ‘勝負’相同 並且 ‘得失球差’相同)
相同:
{
(判斷是否兩支球隊‘得球’相同)
不相同:{調轉兩個球隊次序或者不調轉}
相同:{ 設定 得球重複標誌=是}
}
不相同:
{
}
}
如果‘得球重複標誌’仍為否,則終止循環
}