一维数字数组,拼接获取最大数字

<?php
// 要求: 给定一维数字数组,拼接获取最大数字,如  [4345,43,4,98,9]  ===>  9984434543

$arr = [43,2,12,46,9,98,99,54];
$newArr = [];
$arr = array_map('strval',$arr);

$len = count($arr);

// 对数组进行排序
for($i=0;$i<$len;$i++) {
if(isset($arr[1])) {
$n = $arr[0];
$key = 0;
// 获取最大数
foreach($arr as $k=>$v) {
$re = preNum($n,$v);
if (!$re) {
$n = $v;
$key = $k;
}
}
// 销毁已拼接数字
unset($arr[$key]);
// 排序: 重置键
sort($arr);
// 返回结果
$newArr[] = $n;
}elseif(isset($arr[0])) {
$newArr[] = $arr[0];
}
}
// 将数组进行join
$res = implode($newArr);
$res = intval($res);
var_dump($res); // 结果为99998544643212

/**
* 功能: 如果 $n1 应排前,返回true , 否则返回false
*
* @param string $n1 数字字符串
* @param string $n2 数字字符串
*/
function preNum($n1,$n2) {
$len1 = strlen($n1);
$len2 = strlen($n2);

// 如果位数一样,比较大小即可
if($len1 == $len2) {
if ($n1 < $n2) {
return false;
}else {
return true;
}
}

// 如果位数不一样
$min = min($len1,$len2);
$tmpNum = substr($n1,0,$min);

// 拼接剩余部分,比较拼接后数字大小
if ($len1 < $len2) {
$split2 = substr($n2,$min) . $tmpNum;
$split1 = $tmpNum . substr($n2,$min);

if ($split1 >= $split2) {
return true;
}
}else {
$split2 = substr($n1,$min) . $tmpNum;
$split1 = $tmpNum . substr($n1,$min);

if ($split1 < $split2) {
return true;
}
}

return false;

}

var_dump(preNum('4546','45')); // true

猜你喜欢

转载自www.cnblogs.com/init-007/p/9464879.html