2012-11-19 19 views
0

甚至可以排序數組,使得一個元素(在這種情況下,匹配當前用戶的元素)起泡到頂部,而其餘的在它下面正確地排序?uasort強制一個元素頂部,其餘的正確排序

我試圖做到這一點(是的,我沒有在我的版本的PHP,這是一個恥辱封閉),但沒有運氣。

uasort($output, create_function('$a,$b',               
     'if($a["user_id"] == '.$this->user['id'].') { return -1; }'.        
     'elseif($b["user_id"] == '.$this->user['id'].') { return -1; }'.       
     'elseif($b["percent"] == $a["percent"]) { return strcasecmp($a["username"], $b["username"]); 
     'elseif($a["percent"] < $b["percent"]) { return 1; }'.          
     'elseif($a["percent"] > $b["percent"]) { return -1; }'.          
     'else { return 0; }'                   
    )); 

我認爲這是做這件事的最好方法,因爲我必須對數組進行排序 - 但我願意提供建議。

Thx提前。

回答

1

最好的辦法可能是要做到這一點:

function sortWithUserFirst($output) { 
    $user_ids = Set::extract('/user_id', $output); // list of user ids 
    $user_id_key = array_search($this->user['id']); 
    $user_record = $output[$user_id_key]; 
    unset($output[$user_id_key]); // clear the key => value pair 
    uasort($output, your_sort_function); 
    array_unshift($output, $user_record); // put the user record at the beginning of the array 
} 
+0

標記爲答案,但我真的很希望有辦法我能做到這一點的一個通行證。 我想我真的不明白比較輸出的排序嗎?它不應該工作,所以如果我手動確保何時if($ user_id == 12)返回-1(作爲一個例子),該記錄只會冒泡到頂端? – leo

+0

問題是因爲您正在檢查$ a ['user_id']和$ b ['user_id']等於您的目標值。把$ a當作外部循環迭代器,將$ b當作內部循環迭代器 - 你將$ b與$ a進行比較,所以你應該只檢查$ a ['user_id']是否等於你的目標值,並返回0 $ b ['user_id']這樣做的目的不會改變。 – Derek

+0

哦,**這是**如何工作!外/內迭代器類比是非常有意義的。謝謝! – leo

相關問題