<?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);
$tmpNum1 = substr($n1,0,$min);
$tmpNum2 = substr($n2,0,$min);
if ($tmpNum1 > $tmpNum2) {
return true;
}elseif($tmpNum1 < $tmpNum2){
return false;
}else {
// 拼接剩余部分,比较拼接后数字大小
if ($len1 < $len2) {
$split2 = substr($n2,$min) . $tmpNum1;
$split1 = $tmpNum1 . substr($n2,$min);
if ($split1 >= $split2) {
return true;
}
}else {
$split2 = substr($n1,$min) . $tmpNum1;
$split1 = $tmpNum1 . substr($n1,$min);
if ($split1 < $split2) {
return true;
}
}
return false;
}
}
var_dump(preNum('4546','45')); // true