PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
本文实例讲述了PHP进制转换。分享给大家供大家参考,具体如下:
可以实现:
10进制转换2、8、16、36、62进制
2、8、16、36、62进制转换10进制
有点要注意下,2、8、16进制转换时,使用的是系统的自己的函数。
所以,不管怎么高精度转换值可能大于2147483646。
另外,
32进制低精转换,最大值:2147483646;
32进制高精转换,最大值:77309411327;
64进制高精转换,最大值:133143986175。
jinzhi.php文件,自带演示功能。
代码如下 | 复制代码 |
<?php $mtime1=explode(" ", microtime()); $startTime=$mtime1[0] +$mtime1[1]; ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type"content="text/html; charset=gb2312"/> <title>进制转换/title> </head> <body> <form id="jzh"name="jinzhih"method="post"action=""> <input name="go"type="hidden"value="100"> <table width="482"border="1"cellpadding="0"cellspacing="0"bordercolor="#FFE8E8"bgcolor="#F4F8FB"> <tr> <td width="194"><select name="jinzhi0"id="jinzhi0"> <option value="2">2</option> <option value="8">8</option> <option value="10"selected="selected">10</option> <option value="16">16</option> <option value="36">36</option> <option value="62">62</option> </select> 进制</td> <td width="275"><input name="zhi"type="text"id="zhi"/></td> </tr> <tr> <td>进行<input name="lx"type="radio"value="0"checked="checked"/> 普通<input type="radio"name="lx"value="1"/>高精</td><td> </td> </tr> <tr> <td>转换为 <select name="jinzhi1"id="jinzhi1"> <option value="2"selected="selected">2</option> <option value="8">8</option> <option value="10">10</option> <option value="16">16</option> <option value="36">36</option> <option value="62">62</option> </select>进制,</td><td>总长度为 <input name="changdu"type="text"id="changdu"value="10"size="4"maxlength="2"/> 字符。</td></tr><tr> <td><input type="submit"name="Submit"value="提交"/></td> <td><input type="reset"name="Submit2"value="重置"/></td> </tr></table> <p>注意:仅能进行10进制转换为2、8、16、36、62进制;或反转换。</p></form> <?php classjinzhi_class { //10进制转2、8、16、36、62进制 functionjinzhih_0($shu,$jinzhi,$w) { $zifu=""; while($shu!=0){ $linshi=$shu%$jinzhi; switch($jinzhi){ case2: $zifu=decbin($shu); return$zifu; case8: $zifu=decoct($shu); return$zifu; case16: $zifu=dechex($shu); return$zifu; case36: if($linshi>=10) { $zifu.=chr(($linshi+55)); }else{ $zifu.=$linshi;} break; case62: if(($linshi>=10) && ($linshi36)) {$zifu.=chr($linshi+55);break;} if(($linshi>=36) && ($linshi62)) {$zifu.=chr($linshi+61);break;} $zifu.=$linshi;break; default: $zifu.=$linshi; break; } $shu=intval($shu/$jinzhi); } for($i=strlen($zifu);$i$w;$i++) $zifu.="0"; returnstrrev($zifu);} //2、8、16、36、62进制转10进制 functionjinzhih_1($zifu,$jinzhi,$w) {$shu=0; for($i=0;$i=strlen($zifu)-1;$i++) { $linshi=substr($zifu,$i,1); switch($jinzhi){ case2: $shu=bindec($zifu); $i=strlen($zifu)+1; break; case8: $shu= octdec($zifu); $i=strlen($zifu)+1; break; case16: $shu= hexdec($zifu); $i=strlen($zifu)+1; break; case36: if(ord($linshi)=57) {$shu+=(ord($linshi)-48)*pow($jinzhi,strlen($zifu)-$i-1); }else{ $shu=$shu+ (ord($linshi)-55)*pow($jinzhi,strlen($zifu)-$i-1);} break; case62: if(ord($linshi)=57) {$shu+=$linshi*pow($jinzhi,strlen($zifu)-$i-1); }elseif((ord($linshi)>=65) && (ord($linshi)=90)){ $shu+= (ord($linshi)-55)*pow($jinzhi,strlen($zifu)-$i-1); }else{ $shu+= (ord($linshi)-61)*pow($jinzhi,strlen($zifu)-$i-1);} break; } } return$shu; } //10进制高精度转换2、8、16、36、62进制 functionjinzhih_G0($shu,$jinzhi,$w) { $zifu=""; while($shu!=0){ $linshi=bcmod($shu,$jinzhi); switch($jinzhi){ case2: $zifu=decbin($shu); return$zifu; case8: $zifu=decoct($shu); return$zifu; case16: $zifu=dechex($shu); return$zifu; case36: if($linshi>=10) { $zifu.=chr(($linshi+55)); }else{ $zifu.=$linshi;} break; case62: if(($linshi>=10) && ($linshi36)) {$zifu.=chr($linshi+55);break;} if(($linshi>=36) && ($linshi62)) {$zifu.=chr($linshi+61);break;} $zifu.=$linshi;break; default: $zifu.=$linshi; break; } $shu=intval(bcdiv($shu,$jinzhi)); } for($i=strlen($zifu);$i$w;$i++) $zifu.="0"; returnstrrev($zifu);} //2、8、16、36、62进制高精度转换10进制 functionjinzhih_G1($zifu,$jinzhi,$w) {$shu=""; for($i=0;$i=strlen($zifu)-1;$i++) { $linshi=substr($zifu,$i,1); switch($jinzhi){ case2: $shu=bindec($zifu); $i=strlen($zifu)+1; break; case8: $shu= octdec($zifu); $i=strlen($zifu)+1; break; case16: $shu= hexdec($zifu); $i=strlen($zifu)+1; break; case36: if(ord($linshi)=57) {$shu=bcadd($shu,bcmul((ord($linshi)-48),bcpow($jinzhi,strlen($zifu)-$i-1))); }else{ $shu=bcadd($shu,bcmul((ord($linshi)-55),bcpow($jinzhi,strlen($zifu)-$i-1)));} break; case62: if(ord($linshi)=57) {$shu=bcadd($shu,bcmul($linshi,bcpow($jinzhi,strlen($zifu)-$i-1))); }elseif((ord($linshi)>=65) && (ord($linshi)=90)){ $shu=bcadd($shu,bcmul((ord($linshi)-55),bcpow($jinzhi,strlen($zifu)-$i-1))); }else{ $shu=bcadd($shu,bcmul((ord($linshi)-61),bcpow($jinzhi,strlen($zifu)-$i-1))); } break; } } return$shu;} } if(isset($_GET["p"])) {if($_GET["p"]==="1"){ echo""; echo"提示: "; echo"32进制低精转换,最大值:2147483646 "; echo"32进制高精转换,最大值:77309411327 "; echo"64进制高精转换,最大值:133143986175 "; echo""; echo"值为:"; $Fs=newjinzhi_class(); if($_POST['lx']=="0"&&$_POST['jinzhi0']=="10") {echo$Fs->jinzhih_0($_POST['zhi'],$_POST['jinzhi1'],$_POST['changdu'])." ";} if($_POST['lx']=="1"&&$_POST['jinzhi0']=="10") {echo$Fs->jinzhih_G0($_POST['zhi'],$_POST['jinzhi1'],$_POST['changdu']);} if($_POST['lx']=="0"&&$_POST['jinzhi0']>"10") {echo$Fs->jinzhih_1($_POST['zhi'],$_POST['jinzhi0'],$_POST['changdu']);} if($_POST['lx']=="1"&&$_POST['jinzhi0']>"10") {echo$Fs->jinzhih_G1($_POST['zhi'],$_POST['jinzhi0'],$_POST['changdu']);} } echo"";} $mtime1=explode(" ", microtime()); $endTime=$mtime1[0] +$mtime1[1]; printf ("页面执行时间:%.6fs.",$endTime-$startTime); ?> |
最近做了简答的文章详情页面,需要在页面底部加入上一篇,下一篇 按钮,分析了下,最基本需要有文章的标题和id(作为参数).
开始想的是当前的id加减1,但考虑到如果部分id丢失就不对了,于是分别查询比当前id大和小的记录并且限定为一条,于是有了以下代码。
代码如下,不对的地方请指教.
控制器中
代码如下 | 复制代码 |
//查询上-篇文章 $prev_article= 你的模型::find() ->andFilterWhere(['<','id',$id]) ->andFilterWhere([其他条件) ->orderBy(['id'=> SORT_DESC]) ->limit(1) ->one(); //查询下-篇文章 $next_article= 你的模型::find() ->andFilterWhere(['>','id',$id]) ->andFilterWhere(其他条件) ->orderBy(['id'=> SORT_ASC]) ->limit(1) ->one();
$model['prev_article'] = [ 'url'=> !is_null($prev_article) ? Url::current(['id'=>$prev_article->id]) :'javascript:;', 'title'=> !is_null($prev_article) ?$prev_article->title :'没有了', ];
$model['next_article'] = [ 'url'=> !is_null($next_article) ? Url::current(['id'=>$next_article->id]) :'javascript:;', 'title'=> !is_null($next_article) ?$next_article->title :'没有了', ];
return$this->render('view', 'model'=>$model, ); |
视图中
代码如下 | 复制代码 |
<divclass="left"> <p>上一篇: <a href="<?=$model['prev_article']['url']?>"> <?=$model['prev_article']['title']?> </a> </p> </div> <divclass="right"> <p>下一篇: <a href="<?=$model['next_article']['url']?>"> <?=$model['next_article']['title']?> </a> </p> </div> |
在平台开发过程中,项目分为前台(frontend)www.xxx.com和后台(backend) yun.xxx.com两部分,绑定两个域名, 我们知道在没有绑定域名的时候前后台可以同步登录和退出,但是绑定域名后就失效了,原因是session的作用域不同了。 两个域名的session作用域都只限制在了自己的域名上,我们的解决办法是将不同二级域名的作用域都改成顶级域名xxx.com。
在common/config/main.PHP里面增加如下代码:
代码如下 | 复制代码 |
//跨域session域名配置,获取当前主机名 $host_array=explode('.',$_SERVER["HTTP_HOST"]); //针对com域名,获取顶级域名 if(count($host_array) == 3) { define('DOMAIN',$host_array[1] .'.'.$host_array[2]); } //针对com.cn域名 elseif(count($host_array) == 4) { define('DOMAIN',$host_array[1] .'.'.$host_array[2].'.'.$host_array[3]); } else{ //echo "本系统不支持本地访问,请配置域名";exit; } define('DOMAIN_HOME','www.'. DOMAIN); define('DOMAIN_YUN','yun.'. DOMAIN); define('DOMAIN_API','api.'. DOMAIN); define('DOMAIN_EMAIL','mail.'. DOMAIN); define('DOMAIN_IMG','img.'. DOMAIN); |
修改components部分,改变session作用域
代码如下 | 复制代码 |
'user'=> [ 'identityClass'=>'common\models\User', 'enableAutoLogin'=> true, 'identityCookie'=> ['name'=>'_identity','httpOnly'=> true,'domain'=>'.'. DOMAIN], ], 'session'=> [ 'cookieParams'=> ['domain'=>'.'. DOMAIN,'lifetime'=> 0], 'timeout'=> 3600, ], |
通过上述配置后,多个二级域名间就可以实现同步登录和退出了。
小编推荐的这篇文章介绍了PHP使用preg_split()分割特殊字符(元字符等)的方法分析,非常实用,有兴趣的朋友快来看看吧。本文实例讲述了PHP使用preg_split()分割特殊字符(元字符等)的方法。分享给大家供大家参考,具体如下:
这里所说的特殊字符就是正则中使用的特殊字符,如: | . + 等
其它的先不说,来个实例:
代码如下 | 复制代码 |
$pattern="/[,-\\|\\.]/"; $subject="aaa,bbb,ccc-ddd-eee-fff|ggg|hhh.iii.jjj.kkk"; $spr=preg_split($pattern,$subject); print_r($spr); |
结果:
Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => [10] => [11] => [12] => [13] => [14] => [15] => [16] => [17] => [18] => [19] => [20] => [21] => [22] => [23] => [24] => [25] => [26] => [27] => [28] => [29] => [30] => [31] => [32] => [33] => [34] => [35] => [36] => [37] => [38] => [39] => [40] => [41] => [42] => [43] => )
很显然,这不是我们想要的结果,郁闷了好一会,才找到是什么原因:
把正则表达式内的特殊字符放到前面就没事了, 也就是
$pattern="/[\\|\\.,-]/";
结果:
Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd [4] => eee [5] => fff [6] => ggg [7] => hhh [8] => iii [9] => jjj [10] => kkk )
好了,这就是我们要的结果了
总结:当使用正则表达式中的元字符,普通字符进行 [ ]内的多个字符分割的时候,要把待转义的元字符放在前面.
相关文章
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 在串口通讯过程中,经常要用到 16进制与字符串、字节数组之间的转换...2020-06-25
- c#下进制互转代码...2020-06-25
- <?php教程 /** *十进制转二进制、八进制、十六进制 不足位数前面补零* * * @param array $datalist 传入数据array(100,123,130) * @param int $bin 转换的...2016-11-25
- 这篇文章主要介绍了C#十六进制字符串转十进制int的方法,涉及C#操作数制转换的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇protobuf对象二进制序列化存储(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
复制代码 代码如下:<?php function hex2rgb($colour) { if ($colour [0] == '#') { $colour = substr ( $colour, 1 ); } if (strlen ( $colour ) == 6) { list ( $r, $g,...2013-10-04- 这篇文章主要给大家介绍了C++中输出十六进制形式的字符串,文中给出了详细的介绍,有需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 文章介绍了关于如何利用遍历的方式来实现字符串编码的相互转换,有需要了解的字符串,对象,或者数组转的可以看一下。 代码如下 复制代码 /** ...2016-11-25
- 这篇文章主要介绍了javascript常见数字进制转换,结合实例形式分析了JavaScript十进制,十六进制及二进制的相互转换原理与技巧,需要的朋友可以参考下...2016-04-23
- 这篇文章主要介绍了C#中图片、二进制与字符串的相互转换方法,涉及C#针对不同数据类型的解析与转换操作技巧,需要的朋友可以参考下...2020-06-25
- 在当前目录创建一个文件myfile.txt,对该文件具有读写权限...2020-06-25
- 这篇文章主要介绍了汇编语言进制转换之16进制转10进制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-16
- 这篇文章主要介绍了C#实现的基于二进制读写文件操作,结合具体实例形式分析了C#以二进制文件流形式针对文件进行读写操作的相关技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章介绍了C++ 十进制转换为二进制的实例代码,有需要的朋友可以参考一下...2020-04-25
- #中十六进制字符串的转换函数...2020-06-25
- 这篇文章主要介绍了Python如何读写二进制数组数据,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-08-02
- 这篇文章主要介绍了C++二进制翻转,通过几个实例分析二进制翻转算法的实现技巧,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了详解C++中十六进制字符串转数字(数值)的相关资料,这里提供两种实现方法,需要的朋友可以参考下...2020-04-25