尝试按具有特殊字符的子值对多维数组进行排序

Dav*_*ice 1 php sorting collation multidimensional-array

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

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

$collator = collator_create('en');
collator_asort($collator, $countries, Collator::SORT_STRING);
Run Code Online (Sandbox Code Playgroud)

显然,此示例的列表要短得多,但是此处的排序有效。我期望得到:

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

但是,我需要添加更多数据,并且它变成了多维数据:

$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']; });
Run Code Online (Sandbox Code Playgroud)

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

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

我一生无法解决如何正确分类的问题。我意识到在当前状态下不会调用或应用任何整理程序,但是有没有办法使整理程序在多维环境中工作?

Arn*_*uld 7

以下是基于您的初始方法的可能解决方案:

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'];
});
Run Code Online (Sandbox Code Playgroud)

为了在长列表上获得最佳性能,尽管如此,您可能只想实例化$ collat​​or一次超出匿名函数的范围。