2017-06-17 9 views
0
私が取得します

配列ごとにコレクションを並べ替える方法は?

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

だから、最終的にはこの配列の助けを借りて、指定されたコレクション

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

をソートする方法

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

MenuPositionは雄弁のモデルのインスタンスである

答えて

0

$collectionはこの1つを試してみてください、メニュー項目を保持していると仮定すると:

$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

ありがとうございます。これは非常に簡単で、Collectionマクロに変換するとさらにシンプルになります:) –

0

編集

combine()を使用してこれを達成できます。ドキュメントから:

方法を組み合わせることは、反対コレクションを$ correctOrder配列のキーとしてインデックスを取り、マップ別の配列またはコレクションだから、

の値を持つコレクションのキーを組み合わせてそれら。

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

+0

詳細については私の質問を編集します –

+0

いいえ、彼は特定の配列*によってコレクション*を並べ替えることを意味していることを確かめていますので、 '$ somePointlessOrder'です。 – lesssugar

+0

彼は正確に何をソートしようとしているのかという例がないと言うのは難しいです。 – btl

関連する問題