Laravel sắp xếp một collection theo một mảng cho trước

    Có bao giờ bạn muốn lấy một list các item trong một collection $collection từ một mảng $array gồm các id của các item cần lấy và phải sắp xếp đúng thứ tự các item đó như trong mảng $array đó chưa, chắc hẳn sẽ có nhiều lúc bạn cần dùng.

$collection = collect([
    ['id' => 1, 'name' => 'item 1', 'link' => 'link 1'],
    ['id' => 2, 'name' => 'item 2', 'link' => 'link 2'],
    ['id' => 3, 'name' => 'item 3', 'link' => 'link 3'],
    ['id' => 4, 'name' => 'item 4', 'link' => 'link 4'],
    ['id' => 5, 'name' => 'item 5', 'link' => 'link 5']
]);

$array = [2, 4, 3, 5, 1];

//kết quả mong muốn
$collection = collect([
    ['id' => 2, 'name' => 'item 2', 'link' => 'link 2'],
    ['id' => 4, 'name' => 'item 4', 'link' => 'link 4'],
    ['id' => 3, 'name' => 'item 3', 'link' => 'link 3'],
    ['id' => 5, 'name' => 'item 5', 'link' => 'link 5'],
    ['id' => 1, 'name' => 'item 1', 'link' => 'link 1']
]);

Mình xin phép được chỉ một cách nhanh gọn tốn ít thời gian code nhất.
Mình sẽ sử dụng hàm sortBy của collection, sử dụng hàm callback để tự định nghĩa theo cách sắp xếp của mình

$collection = $collection->sortBy(function ($item) use ($array) {
    return array_search($item['id'], $array);
});

Chúng ta tự định nghĩa lại hàm sortBy sẽ sắp xếp theo key giá trị trong $array, hàm array_search trả về key của giá trị cần tìm trong một mảng.
Hàm sortBy mặc định sẽ sắp xếp theo ASC, nếu muốn sắp xếp theo DESC thì bạn dùng hàm sortByDesc nhé.

 

Bài viết từ pinlaz.com