php字符串函数相关试题场景

// 1、将1234567890转换成1,234,567,890 每3位用逗号隔开的形式。

$sss = '1234567890';  // 1,234,567,890;

$str = '1234567890xx';

//  函数1;
function strrevchunk($str){
	
	return strrev(trim(chunk_split(strrev($str),3,','),','));
	
}

// 函数2;

function arr($str){
	
	return strrev(implode(',',str_split(strrev($str),3)));
	
}

//函数3:

function zixie($str){
	
	$length = strlen($str);
	
	$revstr = strrev($str);
	
	$resrev = '';
	
	for($i = 0;$i<$length;$i++){
		
		$resrev .= substr($revstr,$i,1);
		
	
		if($i%3==2){
			
			$resrev .= ',';
		}
		
	}
	
	return trim(strrev($resrev),',');
}

//函数4;

function push($str){
	
	$length = strlen($str);
	//$revstr = strrev($str);
	$arrsplit = str_split($str);
	$newarr = array();
	for($i = 0;$i<$length;$i++){
		
		array_unshift($newarr,array_pop($arrsplit));
		
		if($i%3==2){
			
			array_unshift($newarr,',');
		}
		
	}
	
	return trim(implode($newarr),',');
	
}


//函数5:

function numberformat($str){
	
	return number_format($str);   
	
	// 注意1:此函数,只对数字有效,非数字字符之后的所有字符会省略;
    // 注意2:此函数可有1个参数(省去小数点),2个参数(小数点保留位数),4个参数(小数点标记表示形式,千分位标记表示形式);
	
}

//函数6:

function arrsplice($str){
	
	$length = strlen($str);                // 原始字符串长度;
	$biaojishu = floor($length/3);         //需要在字符串中插入、添加的字符标记个数(每三字符后添加一个字符);
    $zongchang = $length + $biaojishu;     // 在原始字符串中插入字符后,得到最后的字符串总长度;
	$strrev = strrev($str);                // 先将字符串反转;
	$strtoarr = str_split($strrev);        // 将字符串中每个字符(字节)分割成数组;
	
	for($i = 0;$i<$zongchang;$i++){
		
		array_splice($strtoarr,$i,0);      // 没有新的内容对截取的内容进行修改,保持原数组样式;
		
		if(($i%4 ==3)&&($i!=$zongchang-1)){ //每三个字符后,插入一个字符,新插入字符的位置在4个中最后一位;(3,7,11...从0开始标记的); 如果是末尾的标记则省略(如:123,456,则只需要123,456); 
			
			array_splice($strtoarr,$i,0,',');   // 在此位置插入','(标记)字符;
		}
	}
	
	return strrev(implode($strtoarr));
}


// 使用五种以上方式获取一个文件的扩展名;
//要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,


$filestr = 'dir/upload.image.jpg';

//函数1;

function strposstr($filestr){
	
	return substr($filestr,strrpos($filestr,'.'));

}

// 函数2;

function strrchrstr($filestr){
	
	return strrchr($filestr,'.');
	
}

// 函数3;

function strstrtuue($filestr){
	
	return strrev(strstr(strrev($filestr),'.',TRUE));
	
}


// 函数4;

function strayy($filestr){
	
	return end(explode('.',$filestr));   // 同 array_pop(explode('.',$filestr));
	
	//使用数组最后一个元素,还可以用count()-1
	
	// $arr = (explode('.',$filestr));
	
	// return $arr[count($arr)-1];
	
}

// 函数5;

function strtokarr($filestr){
	
	$tokarr = array();
	$tok = strtok($filestr,'.');

	while($tok !== false){
		$tokarr[] = $tok;
		$tok = strtok('.');
	}

	return $tokarr[count($tokarr)-1];
    
}

// 函数6;

function strsplit($filestr){
	
	$strrev = strrev($filestr);
	$weizhi = strpos($strrev,'.');
	$arr = str_split($strrev,$weizhi);
	return strrev($arr[0]);
}


// 函数7;

function strposoffset($filestr){
	
	$count = substr_count($filestr,'.');        // 得出'.'在字符串中出现了几次;
	$lens = strlen('.');                        // 得出'.'(子字符串)的长度; 
	
	for($i =0;$i<$count;$i++){
		
	    $weizhi = strpos($filestr,'.');        // 逐个找出'.'在字符串中的位置;
		$statr = $weizhi + $lens;              // 子字符串的起始位置;
		$filestr = substr($filestr,$statr);    // 除去第一个标记('.')后的子字符串;
	}
    return $filestr;
}


// 函数8;

// 思路和函数7类似,都是通过循环,找到'.'的位置,然后截取(舍去前一个点的部分),利用子字符串再次查找截取;

function possubstr($filestr){
	
	$sublen = strlen('.');   	// '.'(子字符串)的长度;
	
	while(strpos($filestr,'.')!==false){
		                                     
		$weizhi = strpos($filestr,'.');
		$start = $weizhi + $sublen;
		$filestr = substr($filestr,$start);  
	}
	
	return $filestr;
}


// 函数9;  
//  循环逐个字符的截取,直到找到'.';
function subpos($filestr){
	
	$length = strlen($filestr);
	
	for($i=$length-1;$i>=0;$i--){              // 从最右边(后面)开始;
		
		if(substr($filestr,$i,1)=='.'){        // 找出右边开始'.'($i)的位置(值);
			
			$str = substr($filestr,$i);
			break;                             // 找到第一个就结束,跳出整个循环,不然还有往前找其他的'.';
		}
		
	}
	return $str;
}


// 函数10;

//  循环先找到第一个'.'的位置,然后偏移后再次寻找;

function posoffset($filestr){
	
	$offset = 0;
	
	$sublen = strlen('.');
	
	while(strpos($filestr,'.',$offset)!==false){
		
		$weizhi = strpos($filestr,'.',$offset);
		$offset = $weizhi + $sublen;	
	}
	
	return substr($filestr,$offset);
}


// 函数11;

function filefun($filestr) {
    $p = pathinfo($filestr);
    return $p['extension'];   
}


// 1、由于系统字符串反转函数strrev()函数,只能对acII字符集的字符(字节)进行反转;

// 2、自写一个包含其他字符的字符串反转函数;

// 3、假设为unicode字符集,utf编码;


$aaa = 'ghj我のサービ是一スです个中分gfdfhdgh';

// 函数1;

function utf8srerev($aaa){
	
	if(!is_string($aaa)){
		
		return 'no string';
	}
	
	$lengths = strlen($aaa);        // 字节长度;
	$start = 0;                     // 从哪个字节开始截取;
	$count = 0;                     // 截取几个字节代表一个字符;
	$arr =array();                  // 将截取的每个字符,一次存在数组中;
	$res = '';
    while($start<$lengths){
		
		$highbin = decbin(ord(substr($aaa,$start,1)));           // 字符中的高字节二进制;
		
		if(strlen($highbin)<8){
			
			$count =1;
			
		}else if(substr($highbin,0,3) == '110'){
			
			$count =2;
			
		}else if(substr($highbin,0,4) == '1110'){
			
			$count =3;
		}else if(substr($highbin,0,5) == '11110'){
			
			$count =4;
			
		}else if(substr($highbin,0,6) == '111110'){
			
			$count =5;
			
		}else if(substr($highbin,0,7) == '1111110'){
			
			$count =6;
		}

		$arr[] = substr($aaa,$start,$count);
		
		$start = $start +$count;
	}
	
	$arrgeshu = count($arr);    //数组元素个数,即:不同类型(中、繁体、英文..)字符数;  
	
	// 也可以用每次截取的字符数++,来取得得出的个数;
	
	for($i = $arrgeshu-1;$i>=0;$i--){
		
		$res .= $arr[$i];
	}
	
	return $res;
}


//函数2;

function strrevutf8($aaa){
	
	$lengths = strlen($aaa);
	$zifu = array();
	
	for($i=0;$i<$lengths;){
		
		$highbit = decbin(ord(substr($aaa,$i,1)));             // 每个字符的高字节二进制表示;
		
		if(strlen($highbit)<8){
			
			$zifu[]= $aaa[$i];
			$i++;
		}else if(substr($highbit,0,3)=='110'){
			
			$zifu[] = $aaa[$i].$aaa[$i+1];
			$i += 2;
		}else if(substr($highbit,0,4)=='1110'){
			
			$zifu[] = $aaa[$i].$aaa[$i+1].$aaa[$i+2];
			$i += 3;
		}else if(substr($highbit,0,5)=='11110'){
			
			$zifu[] = $aaa[$i].$aaa[$i+1].$aaa[$i+2].$aaa[$i+3];
			$i += 4;
		}else{            //  最后一个判断(else),不需要再加条件判断了;
			$zifu[] = $aaa[$i].$aaa[$i+1].$aaa[$i+2].$aaa[$i+3].$aaa[$i+4];
			$i += 5;
		}
	}
	
	return implode(array_reverse($zifu));    // 数组先反转、再链接成字符串;
}


// 函数3:  系统自带函数; 两个对字符进行运行的mb_函数


function mb_strrevutf8($aaa){
	
	$len = mb_strlen($aaa,'utf8');            // utf8编码下 字符 的个数;
	$res = '';                                // 反转后结果字符串;
	for($i=1;$i<=$len;$i++){
		
		$res .= mb_substr($aaa,-$i,1,'utf8'); 
	}
	
	return $res;
}
//给两个参数,一个整数值A,代表需要转换的数字,一个整数B,代表返回值的宽度,要求获得,整数A的十六进制字符串,如果宽度不够B,那么前面用0补齐.

//例如 fn(12,8); 返回 "0000000C"

// 方法1:

function dectohex($num,$bits){
	
	$yushuarr = array();     // 将每个数/16的余数,分别存储起来;
	
	while(floor($num/16) !=0){
		
		$yushuarr[] = $num%16;
		
		$num = floor($num/16);
	}
	
	$yushuarr[] = $num%16;   // 当商是0后,取出最后的余数;
	
	$beitihuan = array('10','11','12','13','14','15');
	$tihuancheng  = array('A','B','C','D','E','F');
	$sss = implode($yushuarr);
	
	$shiliu = strrev(str_replace($beitihuan,$tihuancheng,$sss));
	
	return str_pad($shiliu,$bits,0,STR_PAD_LEFT);
	//return $sss;
}

echo(dectohex(1566,8));

// 方法2:

function tohex($iNumber,$iCount){
        $m=$iNumber;
        $l=$iCount;
        $arr=array();
        for($i=0;;$i++){
                //余数定理分解
                $tmp=$m%16;
                //控制变量$m
                $m=$m/16;
                if($tmp<10){
                        //取余<10填充数组
                        $arr[]=$tmp;
                }else{
                        //十六进制的 10-15
                        $arrtmp=array('A','B','C','D','E','F');
                        //取余继续填充数组
                        $arr[]=$arrtmp[$tmp-10];
                }
                //结束单次循环
                if($m<=1){
                        break;
                }
        }
        //根据$i判断是否继续填充0
        if(count($arr)<$l){
                //得到需要填充的个数
                $len=$l-count($arr);
                //循环填充到数组当中
                for($i=0;$i<$len;$i++){
                        $arr[]=0;
                }
        }
        //转化,反转
        echo strrev(implode('',$arr));
}

// 方法3:

//十进制转(2-16)进制

function tohex($n,$z,$l){
    $z=ceil($z);
    if($z<2 || $z>16){
        echo '进制错误';
        exit;
    }
    for($arr=array();;$n=$s){
        $t=$n%$z;           
        $s=floor($n/$z);    //如果$s不等于0,则说明$n的值大于当前的进制值,需要进位
        if($t<10){    
            $arr[]=$t;
        }else{
            $tmp=array('A','B','C','C','E','F');        
            $arr[]=$tmp[$t-10];
        }

        if($s==0){
            break;
        }       
    }
    return strrev(str_pad(implode('',$arr),$l,'0'));
}

echo tohex(568,16,9);


// 函数4:

function dectohex($a,$b){      // $a表示将要转变成16进制的数;      $b表示字符串的宽度;
	
	if($a == 0){
		
		return 0;
	}
	
	while($a != 0){
		
		$yyy = $a%16;
		
		if($yyy<10){
			
			$arryu[] = $yyy;	
		}
		else{
			
			$temp = array('A','B','C','D','E','F');
			$arryu[] = $temp[$yyy-10];
		}
		
		$a = floor($a/16);
	}
	
	$str = strrev(implode($arryu));
	
	if(strlen($str)< $b){
		
		$str = str_pad($str,$b,'0',STR_PAD_LEFT);	
	}
	
	return $str;
}
echo dectohex(1990,8);


猜你喜欢

转载自blog.csdn.net/prdslf001001/article/details/78749985