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;
}
/**
* 数字字符串比较函数
*
* @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:如何使用PHP排序, key为字母+数字的数组(多维数组)
- php获取四位字母和数字的随机数的实现方法
- PHP利用ICU扩展intl快速实现汉字转拼音以及按拼音首字母分组排序
- 小程序:荷兰国旗问题 (大小写字母数字排序问题)包含代码
- PHP数组以中文首字母来排序
- PHP把数字ID转字母ID
- php+正则将字符串中的字母数字和中文分割
- php 匹配汉字 字母 数字 全码特殊字符
- PHP生成随机字符串(字母+数字)
- PHP匹配连续的数字或字母的正则表达式
- PHP排序之二维数组的按照字母排序方法
- php+正则将字符串中的字母数字和中文分割
- 支持中文、字母、数字的PHP验证码
- PHP实现把数字ID转字母ID
- js/jq 数组去重,数组(数字/字母)排序,json合并
- 冒泡排序随便写一串数字,用php实现排序
- PHP实现获取第一个中文首字母并进行排序的方法
- 字母数字汉字排序问题
- 根据数字的首字母大小排序
- PHP制作数字字母混合验证码、图片验证码、中文验证码