PHP实现按照中文一二三排序(支持百千万)

在一次项目开发过程中,会议室列表需要按照中文的一二三排序,下面介绍实现方法。

  1.  提取中文数字
  2. 把中文数字转为阿拉伯数字,作为排序字段加入需要排序的数组
  3. 新数组按照阿拉伯数字字段排序

 

 

    $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;
    }

 经过以上操作,即可实现排序。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值