php自定义排序函数

一般而言系统库函数效率高,有时站在巨人的肩膀上也不失为一种解决办法

最小数字

需求
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

分析

  • 全排列组合,选择最小的一个
  • 对两个数字依据字符串拼接形式,自定义排序规则

实现

function PrintMinNumber($numbers){
    usort($numbers,function($a,$b){
        if ($a == $b) {
            return 0;
        }
        $as = (string)$a;
        $bs = (string)$b;
        return (int)($as.$bs) < (int)($bs.$as) ? -1:1;
    });
    return join("",$numbers);
}

echo PrintMinNumber([3,32,321]);
// 321323

奇前偶后

需求
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

分析

  • 方式一 提取两个有序队列分离合并
  • 方式二 根据奇偶性自定义函数排序规则,

实现

function reOrderArray($array)
{
    usort($array, function ($a, $b) {
        if ($a%2==1 && $b % 2== 0) {
            return -1;
        }
        if ($a%2==0 && $b % 2== 1) {
            return 1;
        }
        if ($a %2==1 && $b%2==1 || $a %2==0 && $b %2==0) {
            return 0;
        }
    });

    return $array;
}

$arr = [2,1,4,5,7,6,11,8,10,3];
$res = reOrderArray($arr);
echo json_encode($res);
// [1,5,7,11,3,2,4,6,8,10]
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页