// 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);