二维数组根据多个字段进行排序封装函数

根据多个字段进行排序是产品常会提出的一个需求,而进行排序的通常都是二维数组。php为满足此需求也提供了array_multisort方法,但该方法却有着一定的尿性:如果排序字段一多,很可能不起效果,排序错乱。

以下方法源于PHP 数组按多个字段排序实现代码
,对其进行改装,可自定义排序方式,如中文排序。
该封装函数使用方式与array_multisort的参数一致,只是代表各排序的数组换成了待排序数组里面的字段名称(如果使用自定义函数的话,则是"name"代表字段名称)。

function sortArrByManyField()
    {
        $args = func_get_args(); // 获取函数的参数的数组
        if (empty($args)) {
            return null;
        }
        $arr = array_shift($args);
        if (!is_array($arr)) {
            throw new Exception("第一个参数不为数组");
        }
//        print_r($args);die;
        foreach ($args as $key => $field) {
            if (is_string($field)) {
                //从字段名的字符串获取出对应的数组
                $temp = array();
                foreach ($arr as $index => $val) {
                    $temp[$index] = $val[$field];
                }
                $args[$key] = $temp;
            } else if (is_array($field)) {  //自建
                //如果使用的是规定好的想要自定义数组,那么进行独特处理
                if (isset($field['function']) && isset($field['field'])) {
                    $fieldName = $field['field'];
                    switch ($field['function']) {
                        case 'chinese_sort':    //如果使用中文名称来进行排序,转换字符格式
                            $temp = array();
                            foreach ($arr as $index => $val) {
                                $temp[$index] = iconv('utf-8', 'GB2312//IGNORE', $val[$fieldName]);;
                            }
                            $args[$key] = $temp;
                            break;
                    }
                }
            }
        }
        $args[] = &$arr;//引用值  todo 重点是这一步!!
        call_user_func_array('array_multisort', $args);
        return array_pop($args);
    }

使用示例:

$matchHb = self::sortArrByManyField($matchHb, 
'sort_type', SORT_ASC,
'match_per', SORT_DESC, 
['field' => 'name', 'function' => 'chinese_sort'], SORT_STRING
);
print_r($matchHb);

扩展:
php多维数组排序方法思路,适用二维、三维、四维…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值