您的位置:首页 > 编程语言 > PHP开发

PHP数字字母混排排序

2012-03-16 17:51 218 查看
为了满足某个项目的需求,写了个数字字母混排排序功能!不是很简洁,但是可以做个参考。

/**
* 数字字符串比较函数
*
* @param <type> $f_cp
* @param <type> $l_cp
* @return <type>
*/
function cmp($f_cp,$l_cp)
{
$f_cp = strtoupper($f_cp);
$l_cp = strtoupper($l_cp);

$f_cp_ary = str_split($f_cp);
$l_cp_ary = str_split($l_cp);

$f_len = count($f_cp_ary);
$l_len = count($l_cp_ary);

foreach($f_cp_ary as $index=>$char)
{
$l_tmp_char = isset($l_cp_ary[$index]) ? $l_cp_ary[$index] : null;
if(is_null($l_tmp_char)) return 1;

if($char == $l_cp_ary[$index]) continue;

if(isNumber($char) && isNumber($l_cp_ary[$index]))//处理2个都是数字的特殊情况 直到后面一位不是数字
{
$f_nber = getArrayCurrIndexAfterAllNumber($f_cp_ary, $index);
$l_nber = getArrayCurrIndexAfterAllNumber($l_cp_ary, $index);

return ($f_nber < $l_nber) ? -1 : 1;
}

$ord_f = ord($char);
$ord_l = ord($l_cp_ary[$index]);

return ($ord_f - $ord_l);
}
return 0;
}

/**
* 是否数字,ascii比较
*
* @param <type> $char
* @return <type>
*/
function isNumber($char)
{
$asc_number = ord($char);

if( $asc_number >= 48 && $asc_number <= 57) return true;
return false;
}

/**
* 是否字母,ascii比较
*
* @param <type> $char
* @return <type>
*/
function isLetter($char)
{
if(empty($char)) return false;
$asc_letter = ord($char);

if( $asc_letter >= 65 && $asc_letter <=122 ) return true;
return false;
}

/**
* 获取连续的数字
*
* @param array $ary
* @param <type> $curr_index
* @return <type>
*/
function getArrayCurrIndexAfterAllNumber(array $ary,$curr_index)
{
$is_number = true;
$index = $curr_index;

$ret_number = array();
while($is_number)
{
$number = isset($ary[$index]) ? $ary[$index] : '';
if(!isNumber($number))
{
$is_number = false;
break;
}

$ret_number[] = $number;
++$index;
}

$ret = '';
if(!empty($ret_number)) $ret = implode('', $ret_number);
return (int)$ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php null