一些php项目中比较通用的php自建函数的详解


Posted in PHP onJune 06, 2013

以下一些php函数是我们it动力最常用的项目开发函数,这些函数还算是在比较多的项目中使用到的,也是比较通用的。
1.请求接口的处理函数

/** 
 * curl访问程序接口 
 * @param string 
 * @return array 
 */  
function getCurlDate($url, $datas, $key) {  
    $datas['time'] = $_SERVER['REQUEST_TIME'] + 300;  
    $post_data['post'] = urlencode(authcode(serialize($datas), "ENCODE", $key));  
//    echo $url;  
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
    // 我们在POST数据哦!  
    curl_setopt($ch, CURLOPT_POST, 1);  
    // 把post的变量加上  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);  
    $output = curl_exec($ch);  
 //   dump(curl_error($ch));  
    curl_close($ch);  
    return json_decode($output, true);  
} 

2.获取文件扩展名
/** 
 * @获取文件扩展名 
 * @$pic string 图片路径 
 */  
function get_file_ext($pic) {  
    return substr($pic, strrpos($pic, '.') + 1);  
} 

3.可逆的加密、解密函数
/** 
 * 字符串加密 
 * @param   $string     需加密的字符 
 * @param   $operation  加密或解密 
 * @param   $key        网站加密key,防止破解 
 * @return  string 
 */  
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {  
    $ckey_length = 4;  
    $key = md5($key ? $key : '^www.itokit.com$');  
    $keya = md5(substr($key, 0, 16));  
    $keyb = md5(substr($key, 16, 16));  
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';      $cryptkey = $keya . md5($keya . $keyc);  
    $key_length = strlen($cryptkey);  
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;  
    $string_length = strlen($string);  
    $result = '';  
    $box = range(0, 255);  
    $rndkey = array();  
    for ($i = 0; $i <= 255; $i++) {  
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);  
    }  
    for ($j = $i = 0; $i < 256; $i++) {  
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;  
        $tmp = $box[$i];  
        $box[$i] = $box[$j];  
        $box[$j] = $tmp;  
    }  
    for ($a = $j = $i = 0; $i < $string_length; $i++) {  
        $a = ($a + 1) % 256;  
        $j = ($j + $box[$a]) % 256;  
        $tmp = $box[$a];  
        $box[$a] = $box[$j];  
        $box[$j] = $tmp;  
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));  
    }  
    if ($operation == 'DECODE') {  
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {  
            return substr($result, 26);  
        } else {  
            return '';  
        }  
    } else {  
        return $keyc . str_replace('=', '', base64_encode($result));  
    }  
} 

4.字符串转十六进制
/** 
* 字符串转十六进制 
* @param unknown_type $s 
*/  
function str2hex($s) {  
  $r = "";  
  $hexes = array ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");  
  for ($i=0; $i<strlen($s); $i++)  
  $r .= ($hexes [(ord($s{$i}) >> 4)] . $hexes [(ord($s{$i}) & 0xf)]);  
  return $r;  
}

5.十六进制转字符串
/** 
* 十六进制转字符串 
* @param unknown_type $s 
*/  
function hex2str($s) {  
  $r = "";  
  for ( $i = 0; $i<strlen($s); $i += 2)  
  {  
    $x1 = ord($s{$i});  
    $x1 = ($x1>=48 && $x1<58) ? $x1-48 : $x1-97+10;  
    $x2 = ord($s{$i+1});  
    $x2 = ($x2>=48 && $x2<58) ? $x2-48 : $x2-97+10;  
    $r .= chr((($x1 << 4) & 0xf0) | ($x2 & 0x0f));  
  }  
  return $r;  
} 

6.返回经addslashes处理过的字符串或数组
/** 
* 返回经addslashes处理过的字符串或数组 
* @param $string 需要处理的字符串或数组 
* @return mixed 
*/  
function new_addslashes($string){  
  if(!is_array($string)) return addslashes($string);  
  foreach($string as $key => $val) $string[$key] = new_addslashes($val);  
  return $string;  
}  /**/  
function addslashes_deep($string)  
{  
  return is_array($string) ? array_map('addslashes_deep', $string) : addslashes($string);  
} 

7.返回经stripslashes处理过的字符串或数组
/** 
* 返回经stripslashes处理过的字符串或数组 
* @param $string 需要处理的字符串或数组 
* @return mixed 
*/  
function new_stripslashes($string) {  
  if(!is_array($string)) return stripslashes($string);  
  foreach($string as $key => $val) $string[$key] = new_stripslashes($val);  
  return $string;  
}  
/**/  
function stripslashes_deep($string)  
{  
  return is_array($string) ? array_map('stripslashes_deep', $string) : stripslashes($string);  
} 

8.返回经 htmlspecialchars 处理过的字符串或数组
/** 
* 返回经 htmlspecialchars 处理过的字符串或数组 
* @param $string 需要处理的字符串或数组 
* @return mixed 
*/  
function new_html_special_chars($string) {  
  if(!is_array($string)) return htmlspecialchars($string);  
  foreach($string as $key => $val) $string[$key] = new_html_special_chars($val);  
  return $string;  
} 

9.获取请求ip
/** 
 * 获取请求ip 
 * 
 * @return ip地址 
 */  
function ip() {  
  if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {  
    $ip = getenv('HTTP_CLIENT_IP');  
  } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {  
    $ip = getenv('HTTP_X_FORWARDED_FOR');  
  } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {  
    $ip = getenv('REMOTE_ADDR');  
  } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {  
    $ip = $_SERVER['REMOTE_ADDR'];  
  }  
  return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';  
} 

10.字符截取 支持UTF8/GBK
/** 
* 字符截取 支持UTF8/GBK 
* @param $string 
* @param $length 
* @param $dot 
*/  
function str_cut($string, $length, $dot = '...') {  
  $strlen = strlen($string);  
  if($strlen <= $length) return $string;  
  $string = str_replace(array(' ',' ', '&', '"', ''', '“', '”', '—', '<', '>', '·', '…'), array('∵',' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $string);  
  $strcut = '';  
  if(strtolower(CHARSET) == 'utf-8') {  
    $length = intval($length-strlen($dot)-$length/3);  
    $n = $tn = $noc = 0;  
    while($n < strlen($string)) {  
      $t = ord($string[$n]);  
      if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {  
        $tn = 1; $n++; $noc++;  
      } elseif(194 <= $t && $t <= 223) {  
        $tn = 2; $n += 2; $noc += 2;  
      } elseif(224 <= $t && $t <= 239) {  
        $tn = 3; $n += 3; $noc += 2;  
      } elseif(240 <= $t && $t <= 247) {  
        $tn = 4; $n += 4; $noc += 2;  
      } elseif(248 <= $t && $t <= 251) {  
        $tn = 5; $n += 5; $noc += 2;  
      } elseif($t == 252 || $t == 253) {  
        $tn = 6; $n += 6; $noc += 2;  
      } else {  
        $n++;  
      }  
      if($noc >= $length) {  
        break;  
      }  
    }  
    if($noc > $length) {  
      $n -= $tn;  
    }  
    $strcut = substr($string, 0, $n);  
    $strcut = str_replace(array('∵', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), array(' ', '&', '"', ''', '“', '”', '—', '<', '>', '·', '…'), $strcut);  
  } else {  
    $dotlen = strlen($dot);  
    $maxi = $length - $dotlen - 1;  
    $current_str = '';  
    $search_arr = array('&',' ', '"', "'", '“', '”', '—', '<', '>', '·', '…','∵'); 
    $replace_arr = array('&',' ', '"', ''', '“', '”', '—', '<', '>', '·', '…',' ');  
    $search_flip = array_flip($search_arr);  
    for ($i = 0; $i < $maxi; $i++) {  
      $current_str = ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];  
      if (in_array($current_str, $search_arr)) {  
        $key = $search_flip[$current_str];  
        $current_str = str_replace($search_arr[$key], $replace_arr[$key], $current_str);  
      }  
      $strcut .= $current_str;  
    }  
  }  
  return $strcut.$dot;  
} 

11.产生随机字符串
/** 
* 产生随机字符串 
* 
* @param        int                $length    输出长度  
* @param        string         $chars     可选的 ,默认为 0123456789 
* @return     string         字符串 
*/  
function random($length, $chars = '0123456789') {  
  $hash = '';  
  $max = strlen($chars) - 1;  
  for($i = 0; $i < $length; $i++) {  
    $hash .= $chars[mt_rand(0, $max)];  
  }  
  return $hash;  
} 

12.将字符串转换为数组
/** 
* 将字符串转换为数组 
* 
* @param  string  $data  字符串 
* @return  array  返回数组格式,如果,data为空,则返回空数组 
*/  
function string2array($data) {  
  if($data == '') return array();  
  eval("\$array = $data;");  
  return $array;  
} 

13.将数组转换为字符串
/** 
* 将数组转换为字符串 
* 
* @param  array  $data    数组 
* @param  bool  $isformdata  如果为0,则不使用new_stripslashes处理,可选参数,默认为1 
* @return  string  返回字符串,如果,data为空,则返回空 
*/  
function array2string($data, $isformdata = 1) {  
  if($data == '') return '';  
  if($isformdata) $data = new_stripslashes($data);  
  return addslashes(var_export($data, TRUE));  
} 

14.转换字节数为其他单位
/** 
* 转换字节数为其他单位 
* 
* 
* @param        string        $filesize        字节大小 
* @return        string        返回大小 
*/  
function sizecount($filesize) {  
        if ($filesize >= 1073741824) {  
                $filesize = round($filesize / 1073741824 * 100) / 100 .' GB';  
        } elseif ($filesize >= 1048576) {  
                $filesize = round($filesize / 1048576 * 100) / 100 .' MB';  
        } elseif($filesize >= 1024) {  
                $filesize = round($filesize / 1024 * 100) / 100 . ' KB';  
        } else {  
                $filesize = $filesize.' Bytes';  
        }  
        return $filesize;  
} 

PHP 相关文章推荐
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
PHP异步调用socket实现代码
Jan 12 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 PHP
php抽象类用法实例分析
Jul 07 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
Yii2 GridView实现列表页直接修改数据的方法
May 16 PHP
Yii2选项卡的简单使用
May 26 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 #PHP
探讨PHP调用时间格式的参数详解
Jun 06 #PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 #PHP
深入密码加salt原理的分析
Jun 06 #PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 #PHP
php定时计划任务的实现方法详解
Jun 06 #PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 #PHP
You might like
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
JS实现仿百度文库评分功能
2017/01/12 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
python对html代码进行escape编码的方法
2015/05/04 Python
Python调用命令行进度条的方法
2015/05/05 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
Flask框架web开发之零基础入门
2018/12/10 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
自我介绍演讲稿
2014/01/15 职场文书
公司中秋节活动方案
2014/02/12 职场文书
新闻学专业求职信
2014/07/28 职场文书
深入浅析Django MTV模式
2021/09/04 Python
美元符号 $
2022/02/17 杂记