2016-06-17 10 views
0

我有一個內部含有一些元素的數組,每個元素都有一個名稱和一個id。例如:對數組中的元素進行排序,以使某些具有一些任意定義的ID的元素先出現

Array 
(
    [0] => stdClass Object 
     (
      [id] => 1 
      [name] => a 
     ) 

    [1] => stdClass Object 
     (
      [id] => 2 
      [name] => b 
     ) 

    [2] => stdClass Object 
     (
      [id] => 3 
      [name] => c 
     ) 

    [3] => stdClass Object 
     (
      [id] => 4 
      [name] => d 
     ) 

    [4] => stdClass Object 
     (
      [id] => 5 
      [name] => e 
     ) 

) 

而且我想與他們做什麼,是讓在另一個數組來定義一些優選的元素,然後解決這一個讓那些「首選」的人將首先出現。

例如在這裏,如果我現在用戶說,他更喜歡用id的4,5,6,那麼應該導致本這些項目的訂單項目:

Array 
(
    [0] => stdClass Object 
     (
      [id] => 4 
      [name] => d 
     ) 

    [1] => stdClass Object 
     (
      [id] => 5 
      [name] => e 
     ) 

    [2] => stdClass Object 
     (
      [id] => 1 
      [name] => a 
     ) 

    [3] => stdClass Object 
     (
      [id] => 2 
      [name] => b 
     ) 

    [4] => stdClass Object 
     (
      [id] => 3 
      [name] => c 
     ) 

) 

4和5,現在首先出現,因爲他們是首選的,6實際上並不存在的事實沒有區別(它只是優先選擇,不是強制性的),其餘的則以後以無關順序列出。

現在,靜態,我知道我可以這樣做實現這一具體行爲:

usort($elements, function($a, $b) { return in_array($a->id, [4,5,6]) ? -1 : 1; }); 

這個工作,它與ID的4和5頂端的元素進行排序。但如果我想要那些[4,5,6]在一個變量,因爲他們來自另一個來源(他們不是靜態的),那麼我不能做這個工作...定義它們在一個名爲$preferred的數組中,然後使用global $preferred函數調用的結果爲$preferred的值爲NULL

這似乎很奇怪,因爲它似乎是一個明智的做法。

那我的選擇是什麼呢?

+1

不使用全局。使用'use'。見例#3:http://php.net/manual/en/functions.anonymous.php –

回答

1

由於試圖使用global當你沒有表現出你的代碼,我無法解釋什麼結果那裏錯了。

無論如何,正如@Marc B所建議的那樣,在您的情況下推薦的方法是使用use而不是global

所以一個簡單的功能實現您打算什麼樣子:

function move_top($preferred, $elements) { 
    usort($elements, function($a, $b) use ($preferred) { 
    return in_array($a->id, $preferred) ? -1 : 1; 
    }); 
    print_r($elements); 
} 
move_top([4,5,6], $elements); 
+0

$ preferred = [4,5,6]; ($ a,$ b){global $ preferred; return in_array($ a-> id,$ preferred)?-1:1;}); –

+0

@ImNotMike這兩個語句是否會出現在函數body_中?在這種情況下,'$ preferred = [4,5,6];'是本地函數,而'global $ preferred;'是_really_ global。 – cFreed

+0

正確。因爲框架是這樣的,我的所有頁面的代碼都是在控制器類的方法中定義的。那麼解決兩種情況,爲什麼'全局'不會工作,和'使用'替代方案(這在方法內部工作),所以我會接受你的答案,因爲一切都在這裏:)(我去'use'到底) –

相關問題