在一次项目开发过程中,会议室列表需要按照中文的一二三排序,下面介绍实现方法。
- 提取中文数字
- 把中文数字转为阿拉伯数字,作为排序字段加入需要排序的数组
- 新数组按照阿拉伯数字字段排序
$meeting = [
['name'=>'会议室一'],
['name'=>'会议室十一'],
['name'=>'会议室三'],
['name'=>'会议室九'],
['name'=>'会议室七'],
];
foreach ($meeting as $key => $val) {
$string = str_replace('会议室','',$val['name']);//提取中文数字
$meeting[$key]['sortorder'] = $this->cn2num($string);//增加数组排序键
}
$meeting = $this->arraySortByKey($meeting,'sortorder');
下面代码为中文数字转阿拉伯数字 cn2num()
/**
* 中文数字转阿拉伯数字 支持百千万
*/
public function cn2num($string)
{
if(is_numeric($string)){
return $string;
}
$num = 0;
$wan = explode('万', $string);
if (count($wan) > 1) {
$num += $this->cn2num($wan[0]) * 10000;
$string = $wan[1];
}
$qian = explode('千', $string);
if (count($qian) > 1) {
$num += $this->cn2num($qian[0]) * 1000;
$string = $qian[1];
}
$bai = explode('百', $string);
if (count($bai) > 1) {
$num += $this->cn2num($bai[0]) * 100;
$string = $bai[1];
}
$shi = explode('十', $string);
if (count($shi) > 1) {
$num += $this->cn2num($shi[0] ? $shi[0] : '一') * 10;
$string = $shi[1] ? $shi[1] : '零';
}
$ling = explode('零', $string);
if (count($ling) > 1) {
$string = $ling[1];
}
$d = array(
'一' => '1','二' => '2','三' => '3','四' => '4','五' => '5','六' => '6','七' => '7','八' => '8','九' => '9', '0' => 0
);
return $num + @$d[$string];
}
下面的代码为根据数组中的某个键值大小进行排序 arraySortByKey()
/**
* 根据数组中的某个键值大小进行排序,仅支持二维数组
*
* @param array $array 排序数组
* @param string $key 键值
* @param bool $asc 默认正序
* @return array 排序后数组
*/
protected function arraySortByKey($array = [], $key = null, $asc = true)
{
$result = array();
$values = [];
// 整理出准备排序的数组
foreach ($array as $k => &$v) {
$values[$k] = isset($v[$key]) ? $v[$key] : '';
}
unset($v);
// 对需要排序键值进行排序
$asc ? asort($values) : arsort($values);
// 重新排列原有数组
foreach ($values as $k => $v) {
$result[] = $array[$k];
}
return $result;
}
经过以上操作,即可实现排序。