2017-06-17 72 views
0

如何定collection如何按數組排序收集?

Collection { 
    #items: array:3 [ 
     0 => MenuPosition, // ->label = "About Us" 
     1 => MenuPosition, // ->label = "Homepage" 
     2 => MenuPosition  // ->label = "Shop" 
    ] 
} 

排序與此數組

$correctOrder = [ 
    'Homepage', 
    'Shop', 
    'About Us' 
]; 

那麼到底的幫助下,我會得到

Collection { 
#items: array:3 [ 
    0 => MenuPosition, // ->label = "Homepage" 
    1 => MenuPosition, // ->label = "Shop" 
    2 => MenuPosition  // ->label = "About Us" 
] 

MenuPosition是雄辯的模型的實例

回答

0

假設$collection持有的菜單項,試試這個:

$collection = 
    /* 
    Collection { 
     #items: array:3 [ 
      0 => MenuPosition, 
      1 => MenuPosition, 
      2 => MenuPosition 
     ] 
    } 
    */ 

$correctOrder = [ 
    'Homepage', 
    'Shop', 
    'About Us' 
]; 

$sorted = $collection->sortBy(function($menuItem, $key) use ($correctOrder) { 
    return array_search($menuItem->label, $correctOrder); 
}); 

array_search()給你的價值的指數在數組中。

請記住集合中的label以及$correctOrder中的值需要具有相同的工作情況。儘管這不是一個非常靈活的方法,因爲名稱可能會改變。

+0

謝謝,這看起來很簡單,將更簡單的時候轉換爲集合宏:) –

0

編輯

您可以使用combine()來實現此目的。從文檔:

的結合方法結合了另一個數組或集合

這樣的值集合的鍵把指數從$ correctOrder排列的按鍵和映射集反對那些。

https://laravel.com/docs/5.4/collections#method-combine

+0

我將編輯我的問題以獲取更多信息 –

+0

不,確定他的意思是按給定數組*排序集合*,所以'$ somePointlessOrder'。 – lesssugar

+0

很難說沒有一個他究竟想要排序的例子。 – btl