【问题标题】:Sort By Alphabet then Numbers Laravel Collection按字母排序,然后按数字排序 Laravel 集合
【发布时间】:2021-06-27 19:50:10
【问题描述】:

我正在寻找一种方法来对集合进行排序,使以字母开头的名称位于顶部,然后是以数字开头的名称。例如:

$collection = collect([
    ['name' => 'b', 'symbol' => '#'],
    ['name' => '2a', 'symbol' => '$'],
    ['name' => '1', 'symbol' => '@'],
    ['name' => 'a', 'symbol' => '%']
]);

上面的集合应该是这样排序的:

[
    [
        "name" => "a",
        "symbol" => "%",
    ],
    [
        "name" => "b",
        "symbol" => "#",
    ],
    [
        "name" => "1",
        "symbol" => "@",
    ],
    [
        "name" => "2a",
        "symbol" => "$",
    ],
]

但这就是我使用sortBy 方法对其进行排序时得到的结果:

$collection->sortBy('name')->values()->all();
[
    [
        "name" => "1",
        "symbol" => "@",
    ],
    [
        "name" => "2a",
        "symbol" => "$",
    ],
    [
        "name" => "a",
        "symbol" => "%",
    ],
    [
        "name" => "b",
        "symbol" => "#",
    ],
]

知道如何对该集合进行排序,以便以字母开头的名称排在第一位。谢谢

【问题讨论】:

    标签: php laravel laravel-collection


    【解决方案1】:

    您需要定义自己的自定义比较器函数来使用sort 对这些集合对象进行排序。

    通过检查它们都是字母来比较两个名称。如果两者都是字母,那么通常使用strcasecmp 进行字符串比较就足够了。如果它们中的任何一个是字母表,则通过返回值-1 将它们推到更高的排名,这意味着按排序顺序放置在上面。如果两者都是数字或字母数字,请再次使用strcasecmp

    <?php
    
    $collection = collect([
        ['name' => 'b', 'symbol' => '#'],
        ['name' => '2a', 'symbol' => '$'],
        ['name' => '1', 'symbol' => '@'],
        ['name' => 'a', 'symbol' => '%']
    ]);
    
    $collection = $collection->sort(function($a,$b){
        $a_is_alphabet = preg_match('/^[a-zA-Z]+$/', $a['name']) === 1;
        $b_is_alphabet = preg_match('/^[a-zA-Z]+$/', $b['name']) === 1;
    
        if($a_is_alphabet && $b_is_alphabet){
            return strcasecmp($a['name'], $b['name']);
        }elseif($a_is_alphabet){
            return -1;
        }elseif($b_is_alphabet){
            return 1;
        }
    
        return strcasecmp($a['name'], $b['name']);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      相关资源
      最近更新 更多