Laravel自定义字母排序回调函数

yvfmudvl  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(138)

我有一个项目(衬衫),可以是一个不同的尺寸范围的集合。尺寸的顺序应如下所示。
XS1, XS3, ... S1, S3, ... M1, M3, ... L1, L3, ... XL1, XL3, ... 2XL1, ... 3XL1, ...
现在我进行排序的时候
$items->sortBy('size')
它将结果输出为
2XL#, 3XL#, L#, M#, S# XL#, XS#
这是有意义的,因为这是基于字母和数字顺序的自然排序。
写一个回调函数来按我需要的特定顺序排序的最好方法是什么?

yeotifhr

yeotifhr1#

Illuminate Collection类的各种排序方法采用一个可选的callable作为参数,这样您就可以提供自己的排序机制。使用这个方法,你可以定义一个不同大小的数组,按照你希望它们出现的顺序,然后使用目标字符串在该数组中的位置作为你的排序比较器:

$collection = collect([
    ['id' => 1, 'size' => 'S3'],
    ['id' => 2, 'size' => 'M1'],
    ['id' => 3, 'size' => 'XS1'],
    ['id' => 4, 'size' => '3XL1'],
    ['id' => 5, 'size' => 'S1'],
]);

$sorted = $collection->sortBy([
    function($a, $b) {
        $order = ['XS1', 'XS3', 'S1', 'S3', 'M1', 'L1', 'L3', 'XL1', 'XL3', '2XL1', '3XL1'];
        return array_search($a['size'], $order) <=> array_search($b['size'], $order);
    }
]);

print_r($sorted->toArray());

这产生:

Array
(
    [0] => Array
        (
            [id] => 3
            [size] => XS1
        )

    [1] => Array
        (
            [id] => 5
            [size] => S1
        )

    [2] => Array
        (
            [id] => 1
            [size] => S3
        )

    [3] => Array
        (
            [id] => 2
            [size] => M1
        )

    [4] => Array
        (
            [id] => 4
            [size] => 3XL1
        )

)

或者(稍微更有性能),你可以让你的排序数组关联键作为大小,值作为排序顺序:

$sorted = $collection->sortBy([
    function($a, $b) {
        $order = [
            'XS1' => 0,
            'S1' => 1,
            'S3' => 2,
            'M1' => 3,
            '3XL1' => 4,
        ];
        return $order[$a['size']] <=> $order[$b['size']];
    }
]);

相关问题