【问题标题】:Laravel / PHP Language Code SortingLaravel / PHP 语言代码排序
【发布时间】:2016-06-20 10:26:33
【问题描述】:

我的数据库中存储了一些语言,如下所示:

id | code  | name 
--------------------------------------
1  | en_GB | English, United Kingdom
2  | pt_BR | Portugese, Brazil
3  | it_IT | Italian, Italy
4  | hi_IN | Hindi, India
5  | es_BR | Spanish, Brazil
6  | ur_IN | Urdu, India

我想获取这些结果并进行排序(或在获得所有结果后进行排序),因此我首先按排序的国家代码(代码的第二部分)然后按区域设置代码(代码的第一部分)获得结果,所以:

$languages = [
    0 => [
       'code' => 'es_BR'
    ],
    1 => [
       'code' => 'pt_BR'
    ],
    2 => [
       'code' => 'en_GB'
    ],
    3 => [
       'code' => 'hi_IN'
    ],
    4 => [
       'code' => 'ur_IN'
    ],
    5 => [
       'code' => 'it_IT'
    ]
];

我尝试遍历每种语言并取出第二部分并存储国家代码数组,然后使用asort($countryCodes); 对它们进行排序,它按国家代码 (GB) 排序,但我无法排序按区域设置代码 (en) 列出。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 到目前为止你尝试过任何代码吗?
  • 有没有检查?
  • 我是否因为人们无法回答我的问题而投票失败?

标签: php mysql database laravel sorting


【解决方案1】:

我想出了以下内容,它给了我我需要的东西:

$languages = $this->getOrderedLanguages();

protected function getOrderedLanguages() 
{
    $languages = Language::orderBy('code')->get();

    // Sort out the other languages by country code (e.g. sort by GB in code en_GB)
    // Create array for each country code and store array key from original list
    $countryCodes = [];
    foreach($languages as $key => $language) {
        $countryCodes[$language->locale_code][] = [
            'id' => $key,
            'language' => $language->language_code
        ];
    }
    ksort($countryCodes);

    $orderedLanguages = [];

    // Go through each country code and sort the languages in there by locale code (e.g. sort by en in code en_GB)
    foreach($countryCodes as &$countryCode) {
        asort($countryCode);
        foreach($countryCode as $language) {
            $orderedLanguages[] = $allLanguages[$language['id']];
        }
    }

    // Return ordered array
    return $orderedLanguages;
}

这给了我以下结果:

$languages = [
    0 => [
        'code' => 'es_BR'
    ],
    1 => [
        'code' => 'pt_BR'
    ],
    2 => [
        'code' => 'en_GB'
    ],
    3 => [
        'code' => 'hi_IN'
    ],
    4 => [
        'code' => 'ur_IN'
    ],
    5 => [
        'code' => 'it_IT'
    ]
];

【讨论】:

    【解决方案2】:

    我猜array_multisort 就是你要找的。​​p>

    【讨论】:

    • 一开始我以为可能是这样,但是 array_multisort 要求代码在不同的字段中?我将如何应用 array_multisort 来获得我正在寻找的东西?
    • #@Mehul Kuriya :仅供参考,这也是一个简单而简单的答案......!
    【解决方案3】:

    你会使用 usort() - http://php.net/usort

    我的建议是:

    function cmp($a, $b){
        return strcmp($a["code"], $b["code"]);
    }
    
    usort($languages, "cmp");
    print_r($languages);
    

    希望对你有帮助

    【讨论】:

    • 我得到了以下结果:en_GB, es_BR, hi_IN, it_IT, pt_BR, ur_IN,所以是数据库中的原始订单
    • 你的预期是?
    • es_BR, pt_BR, en_GB, hi_IN, ur_IN, it_IT
    【解决方案4】:

    请尝试其他版本的代码:

    $fArray=array();
    foreach($languages as $languages){
       array_push($fArray,$languages);
    }
    sort($fArray);
    print_r($fArray);  
    
    `OR`
    
    array_multisort($languages);
    print_r($languages);
    

    以下是为这两个函数生成的数组:

    Array
    (
     [0] => Array
        (
            [code] => en_GB
        )
    
    [1] => Array
        (
            [code] => es_BR
        )
    
    [2] => Array
        (
            [code] => hi_IN
        )
    
    [3] => Array
        (
            [code] => it_IT
        )
    
    [4] => Array
        (
            [code] => pt_BR
        )
    
    [5] => Array
        (
            [code] => ur_IN
        )
    
    )
    

    【讨论】:

    • 这不是我要找的,这只是按数据库 id 排序的
    • 那你在找什么?
    • 确实按国家/地区代码 (GB) 排序,但我坚持按区域设置代码 (en) 排序该列表。这是什么意思?
    • 所以它应该首先按国家代码的第二部分(GB 部分)对列表进行排序,然后按区域设置代码(en 部分)排序,所以我应该有以下内容:@ 987654323@。因此它按 BR、GB、IN 和 IT 排序,并且在其中按第一部分排序(对于 BR,在 pt 之前)
    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多