先来个从字符串中抽出数字的函数(必写)
public function getVersonArr($str)
{
$temp=array('0','1','2','3','4','5','6','7','8','9');
// $temp1=array('零','一','二','三','四','五','六','七','八','九');
$len = strlen($str);
$new_str = [
'connector' => '',
'verson' => ''
];
for($i=0;$i<$len;$i++)
{
if(in_array($str[$i], $temp))
{
$new_str['verson'] .= $str[$i];
if(!empty($str[$i+1]) && !in_array($str[$i+1], $temp)){
$new_str['connector'] = $str[$i+1];
$new_str['verson'] .= $str[$i+1];
$i++;
}
}
// else if(in_array($str[$i], $temp1))
// {
// $new_str['verson'] .= $temp1[$str[$i]];
// if(!empty($str[$i+1]) && !in_array($str[$i+1], $temp)){
// $new_str['connector'] = $str[$i+1];
// $new_str['verson'] .= $str[$i+1];
// $i++;
// }
// }
}
return $new_str;
}
然后是正文,比较版本,我还预想的了中文,被我注释掉了,因为中文字符不算一个string,以后有实际需求再优化
public function getFirst($v1, $v2)
{
$num1 = $this->getVersonArr($v1);
$num2 = $this->getVersonArr($v2);
$l1 = explode($num1['connector'],$num1['verson']);
$l2 = explode($num1['connector'],$num2['verson']);
$len = count($l1) > count($l2) ? count($l1): count($l2);
for($i = 0; $i < $len; $i++)
{
$len1 = strlen($l1[$i]);
$len2 = strlen($l2[$i]);
$len_n = $len1<$len2?$len1:$len2;
for($r = 0;$r<$len_n;$r++)
{
if ($l1[$i][$r] > $l2[$i][$r])
{
echo $v1.'大于'.$v2;//需要更新
return ;
}
else if ($l1[$i][$r] < $l2[$i][$r])
{
echo $v1.'小于'.$v2;//不需要更新
return ;
}
}
if($len1!=$len2)
{
echo $len1>$len2?$v1.'大于'.$v2:$v1.'小于'.$v2;//需要更新
return ;
}
}
echo $v1.'等于'.$v2;
return ;
}
思路其实很简单的,就是先把字符串中的数字取出来(数字中间的间隔符记录并放在数字中),把取出的数字(带间隔符)按照间隔符分开,再一一比较,从第一个开始比,每一个从第一位开始比,一直比到最后,没有结果就是等于咯