中文截取无乱码、 顺序查找和二分查找函数

来源:互联网 发布:小学生画图软件 编辑:程序博客网 时间:2024/05/18 01:32
共两种方法,第一种比较全面,第二种方法比较精简(只适合中文和ANSI字符的截取)
第一种,比较全面:
function utf8SubFix($str,$start,$len){
    $strlen=strlen($str);
    if(!$len||$len<=0||$len<$start){
        echo '参数错误';
        return false;
    }
    if($strlen<$len){
        $len=$strlen;
    }
    $offset=0;
    $chars=0;
    $res='';
    while(($chars-$start)!=$len){
        $high=decbin(ord(substr($str,$offset,1)));
        if(strlen($high)<8){
            $count=1;
        }else if(strcmp($high & '11100000',11000000)==0){
            $count=2;
        }else if(strcmp($high & '11110000',11100000)==0){
            $count=3;
        }else if(strcmp($high&'11111000','11110000')==0){
            $count=4;
        }else if(strcmp($high&'11111100','11111000')==0){
            $count=5;
        }else if(strcmp($high&'11111110',11111100)==0){
            $count=6;
        }else{
            echo "default";
            echo ($high & '111100000');
            echo "<br>";
        }
        if($start<=$chars){
            $res.=substr($str,$offset,$count);
        }
        $chars+=1;
        $offset+=$count;
        //echo "<br>".$high;


    }
    return $res;
}



第二种,比较精简,只适合中文和ANSI字符的截取
function mixSubstr($str, $length, $start=FALSE)
{
    $strlen = strlen($str);
    if( $length<=0||!$length||($start >= $strlen)){
        return false;
    }
    if($length > $strlen) {
        $length = $strlen;
    }
    $content = '';
    $sing = 0;
    $count = 0;
    //截取开始,中文字符占用3个字,所以从第一个开始依次判断,大于0xa0则开始截取三个字,小于则只截取一个
    //只针对中文有效,或者字符占3个字的文字
    while($length != ($count-$start))
    {
        if(ord($str[$sing]) > 0xa0) {
            if(!$start || $start <= $count) {
                $content .= $str[$sing].$str[$sing+1].$str[$sing+2];
            }
            $sing += 3;
            $count++;
        }else{
            if(!$start || $start <= $count) {
                $content .= $str[$sing];
            }
            $sing++;
            $count++;
        }
    }
    return $content;

}


  1. //顺序查找(数组里查找某个元素) 
  2. function seq_sch($array, $n, $k){ 
  3.       $array[$n] = $k; 
  4.       for($i=0; $i<$n; $i++){ 
  5.           if($array[$i]==$k){ 
  6.               break; 
  7.           } 
  8.       } 
  9.       if ($i<$n){ 
  10.           return $i; 
  11.       }else{ 
  12.           return -1; 
  13.       } 
  14. }

  1. function binaryfind($arr, $findVal, $lindex, $rindex) {
  2.         
  3.         if ($lindex <= $rindex) {
  4.                 $mindex = floor(($rindex + $lindex) / 2);
  5.         } else {
  6.                 return -1;  //找不到,返回-1
  7.         }

  8.         if ($findVal == $arr[$mindex]) {
  9.                 return $mindex;
  10.         } else if ($findVal > $arr[$mindex]) {
  11.                 $lindex = $mindex + 1;
  12.                 return binaryfind($arr, $findVal, $lindex, $rindex);
  13.         } else if ($findVal < $arr[$mindex]) {
  14.                 $rindex = $mindex - 1;
  15.                 return binaryfind($arr, $findVal, $lindex, $rindex);
  16.         }

  17. }