尝试使用带有特殊字符的子值

时间:2016-07-03 15:39:26

标签: php sorting multidimensional-array collation

我曾经有一个包含国家列表的PHP数组:

$countries = array(
  'AX' => 'Åland Islands',
  'AF' => 'Afghanistan',
  'GB' => 'United Kingdom'
);

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

显然这个例子的列表要短得多,但这里的排序很有用。我期待并得到:

  • 阿富汗
  • 奥兰群岛
  • 英国

但是,我需要添加更多数据,它变得多维:

$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']; });

它对列表中的每个其他国家进行排序,但是给了我:

  • 阿富汗
  • 英国
  • 奥兰群岛

我不能为我的生活找出如何正确排序。我意识到在它的当前状态下没有调用或应用整理器,但有没有办法让整理器在多维环境中工作?

3 个答案:

答案 0 :(得分:5)

以下是基于您的初始方法的可能修复:

MemoryStream

为了在长列表中获得最佳性能,您可能只想在匿名函数的范围之外实例化$ collat​​or。

答案 1 :(得分:1)

要对没有Collator“国家/地区列表”进行排序,您应该将带有重音字符的所有字词转换为其ASCII演示文稿(例如{{ 1}}到Å)使用A函数:

iconv

输出:

usort($countries, function($a, $b){
    return strcasecmp(iconv('utf-8', 'ascii//TRANSLIT', $a['name']), iconv('utf-8', 'ascii//TRANSLIT', $b['name']));    
});

print_r($countries);

答案 2 :(得分:0)

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

$collator = new Collator('en');
usort($countries, function($a, $b) use ($collator) {
    return $collator->compare($a['name'], $b['name']);
});