php中ASCⅡ码

<?php
class ascii
{

function decode ( $str )
{
     preg_match_all ( " /(d{2,5})/ " , $str , $a ) ;
     $a = $a [ 0 ] ;
     foreach ( $a as $dec )
     {
         if ( $dec < 128 )
         {
             $utf .= chr ( $dec ) ;
         }
         else if ( $dec < 2048 )
        {
             $utf .= chr ( 192 + (( $dec - ( $dec % 64 )) / 64 )) ;
             $utf .= chr ( 128 + ( $dec % 64 )) ;
         }
         else
         {
             $utf .= chr ( 224 + (( $dec - ( $dec % 4096 )) / 4096 )) ;
             $utf .= chr ( 128 + ((( $dec % 4096 ) - ( $dec % 64 )) / 64 )) ;
             $utf .= chr ( 128 + ( $dec % 64 )) ;
         }
     }
     return $utf ;
}

function encode ( $c )
{
     $len = strlen ( $c ) ;
     $a = 0 ;
     while ( $a < $len )
     {
         $ud = 0 ;
         if ( ord ( $c { $a }) >= 0 && ord ( $c { $a }) <= 127 )
         {
             $ud = ord ( $c { $a }) ;
             $a += 1 ;
         }
         else if ( ord ( $c { $a }) >= 192 && ord ( $c { $a }) <= 223 )
         {
             $ud = ( ord ( $c { $a }) - 192 ) * 64 + ( ord ( $c { $a + 1 }) - 128 ) ;
             $a += 2 ;
         }
         else if ( ord ( $c { $a }) >= 224 && ord ( $c { $a }) <= 239 )
         {
             $ud = ( ord ( $c { $a }) - 224 ) * 4096 + ( ord ( $c { $a + 1 }) - 128 ) * 64 + ( ord ( $c { $a + 2 }) - 128 ) ;
             $a += 3 ;
         }
         else if ( ord ( $c { $a }) >= 240 && ord ( $c { $a }) <= 247 )
         {
             $ud = ( ord ( $c { $a }) - 240 ) * 262144 + ( ord ( $c { $a + 1 }) - 128 ) * 4096 + ( ord ( $c { $a + 2 }) - 128 ) * 64 + ( ord ( $c { $a + 3 }) - 128 ) ;
             $a += 4 ;
         }
         else if ( ord ( $c { $a }) >= 248 && ord ( $c { $a }) <= 251 )
         {
             $ud = ( ord ( $c { $a }) - 248 ) * 16777216 + ( ord ( $c { $a + 1 }) - 128 ) * 262144 + ( ord ( $c { $a + 2 }) - 128 ) * 4096 + ( ord ( $c { $a + 3 }) - 128 ) * 64 + ( ord ( $c { $a + 4 }) - 128 ) ;
             $a += 5 ;
         }
         else if ( ord ( $c { $a }) >= 252 && ord ( $c { $a }) <= 253 )
         {
             $ud = ( ord ( $c { $a }) - 252 ) * 1073741824 + ( ord ( $c { $a + 1 }) - 128 ) * 16777216 + ( ord ( $c { $a + 2 }) - 128 ) * 262144 + ( ord ( $c { $a + 3 }) - 128 ) * 4096 + ( ord ( $c { $a + 4 }) - 128 ) * 64 + ( ord ( $c { $a + 5 }) - 128 ) ;
             $a += 6 ;
         }
         else if ( ord ( $c { $a }) >= 254 && ord ( $c { $a }) <= 255 )
         { //error
             $ud = false ;
         }
         $scill .= " &# $ud ; " ;
     }
     return $scill ;
}

最近在技术群中有位兄弟提出了一个问题:

想让自增的ID格式化为

A001——A999

B001——B999

……

Z001——Z999,

我最初的构思是循环中,分if条件判断出来进行A——Z字母,

但是这样做有个极大的缺点,代码显得很呆板冗余,26个英文字母等于需要26个判断。

后来有人支招将字母变成ASCⅡ码,恰好A——Z等于ASCⅡ码的65——91;

这样就只需要一个函数进行格式化ID就可以了:
    function format_string( $num ) {
         $tag = floor (( $num - 1 ) / 999 );
         // part1计算asc码
         $part1 = 65 + $tag ;

         // part2计算数字部分
         $part2 = $num - 999 * $tag ;

         $a = strlen ( $part2 );

         for ( $i = 0 ; $i < ( 3 - $a ); $i ++ )
         {
          $b .= 0 ;
         }
         $str = chr ( $part1 ) . $b . $part2 ;
         return $str ;
     }

     for ( $i = 1 ; $i < 5000 ; $i ++ )
     {
          echo     $str = format_string( $i ) . ' <br /> ' ;
     }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值