首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图通过具有特殊字符的子值对多维数组进行排序。

试图通过具有特殊字符的子值对多维数组进行排序。
EN

Stack Overflow用户
提问于 2016-07-03 15:39:26
回答 3查看 1.2K关注 0票数 1

我以前有一个PHP数组,其中包含一个国家列表:

代码语言:javascript
复制
$countries = array(
  'AX' => 'Åland Islands',
  'AF' => 'Afghanistan',
  'GB' => 'United Kingdom'
);

$collator = collator_create('en');
collator_asort($collator, $countries, Collator::SORT_STRING);

显然,对于这个例子,这个列表要短得多,但是这里的排序是有效的。我预料到了然后得到了:

  • 阿富汗
  • 奥兰岛
  • 英国

然而,我需要添加更多的数据,并且它变成了多维的:

代码语言:javascript
复制
$countries = array(
  array(
    'name' => 'Åland Islands',
    'code' => 'AX'
  ),
  array(
    'name' => 'Afghanistan',
    'code' => 'AF'
  ),
  array(
    'name' => 'United Kingdom',
    'code' => 'GB'
  )
);

usort($countries, function($a, $b){ return $a['name'] <=> $b['name']; });

它对名单上的其他国家进行了排序,但给了我这样的答案:

  • 阿富汗
  • 英国
  • 奥兰岛

我一生都想不出该如何正确地解决这个问题。我意识到没有在它的当前状态中调用或应用校勘器,但是是否有一种方法可以使校勘器在多维环境中工作呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-03 16:07:12

下面是基于您的初步方法的可能解决方案:

代码语言:javascript
复制
usort($countries, function($a, $b) {
  $collator = collator_create('en');
  $arr = array($a['name'], $b['name']);
  collator_asort($collator, $arr, Collator::SORT_STRING);

  return array_pop($arr) == $a['name'];
});

但是,为了在长列表上获得最佳性能,您可能只想在匿名函数的作用域之外实例化$collator一次。

票数 6
EN

Stack Overflow用户

发布于 2019-10-23 07:35:11

对于多维数组,我们可以使用collator_compare()函数定义自定义排序函数:

代码语言:javascript
复制
$collator = new Collator('en');
usort($countries, function($a, $b) use ($collator) {
    return $collator->compare($a['name'], $b['name']);
});
票数 2
EN

Stack Overflow用户

发布于 2016-07-03 16:03:39

要对没有Collator的“国家列表”进行排序,您应该使用iconv函数将所有带有重音字符的单词转换为它的ASCII表示(例如ÅA):

代码语言:javascript
复制
usort($countries, function($a, $b){
    return strcasecmp(iconv('utf-8', 'ascii//TRANSLIT', $a['name']), iconv('utf-8', 'ascii//TRANSLIT', $b['name']));    
});

print_r($countries);

产出:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [name] => Afghanistan
            [code] => AF
        )

    [1] => Array
        (
            [name] => Åland Islands
            [code] => AX
        )

    [2] => Array
        (
            [name] => United Kingdom
            [code] => GB
        )
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38171550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档