Laravel / PHP:按字母顺序排序,按顺序排列

时间:2014-10-21 18:23:39

标签: php mysql laravel

按字母顺序排序时,我留下了这个:

S1 Episode 1
S1 Episode 11
S1 Episode 12
S1 Episode 2
S1 Episode 3

S2 Episode 1
S2 Episode 11

示例代码:

DB::table('test')->orderby('title', 'ASC')->get();

等。我需要这些才能正确订购。任何解决方案?

感谢。

6 个答案:

答案 0 :(得分:10)

您正面临着以字母数字或计算机科学术语排序项目的问题,自然排序。

many ways to achieve a natural sort with straight MySQL但您也可以将Laravel助手的结果转换为数组格式并实现PHP natsort function instead

从我上面找到的方法中,我得出了可能通过示例代码解决问题的最佳方法:

DB::table('test')->orderBy('LENGTH(title)', 'ASC')
    ->orderBy('title', 'ASC')
    ->get();

但是我不确定帮助者是否会抱怨在orderBy函数中接收MySQL函数而不是直列名称。我只是从我与你的例子结合使用的参考文献中抄写 - 我无法保证其功效。

答案 1 :(得分:3)

对于Laravel来说,这也有效:

$collection = $collection->sortBy('order', SORT_REGULAR, true);

答案 2 :(得分:1)

可能会晚一些,但对其他人可能会有所帮助。

基于上面我在下面找到的链接,我导出了可能会解决示例代码问题的最佳方法: https://www.electrictoolbox.com/mysql-order-string-as-int/

查询

SELECT * FROM <table> ORDER BY CAST(<column> AS unsigned)

laravel示例

DB::table('test')
    ->orderByRaw("CAST(title as UNSIGNED) ASC")
    ->get();

答案 3 :(得分:1)

对于Laravel系列:

$collection = collect([
    ['sn' => '2'],
    ['sn' => 'B'],
    ['sn' => '1'],
    ['sn' => '10'],
    ['sn' => 'A'],
    ['sn' => '13'],
]);

$sorted = $collection->sortBy('sn');

//print_r($collection);

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [2] => Array
                (
                    [sn] => 1
                )

            [0] => Array
                (
                    [sn] => 2
                )

            [3] => Array
                (
                    [sn] => 10
                )

            [5] => Array
                (
                    [sn] => 13
                )

            [4] => Array
                (
                    [sn] => A
                )

            [1] => Array
                (
                    [sn] => B
                )

        )

)

如您所见,这将正确对其进行排序。但是,如果您想对其进行排序并对其重新编制索引,

$sorted = $collection->sortBy('sn')->values()->all();

//print_r($sorted)

Array
(
    [0] => Array
        (
            [sn] => 1
        )

    [1] => Array
        (
            [sn] => 2
        )

    [2] => Array
        (
            [sn] => 10
        )

    [3] => Array
        (
            [sn] => 13
        )

    [4] => Array
        (
            [sn] => A
        )

    [5] => Array
        (
            [sn] => B
        )

)

此外,您还可以传递自己的回调以确定如何对集合值进行排序。

$sorted = $collection->sortBy(function ($item, $key) {
    //your logic
});

有关更多详细信息:https://laravel.com/docs/5.8/collections#method-sortby

答案 4 :(得分:0)

DB::table('test')->orderByRaw('LENGTH(title)', 'ASC')
->orderBy('title', 'ASC')
->get();

答案 5 :(得分:0)

订购结果集合

$unorderedThings = Thing::orderBy('id')->get();
$orderedThings=$unorderedThings->sort();
相关问题