PHP工具方法、函数总结

kyle 2016-11-24 1653次浏览 0条评论 0 打赏作者 0 0
/**
 * 将数值三位分割,加千分位的分隔符(多用于钱数,金额)
 * @param $count
 * @return mixed
 */
function formatCount($count){
    if($count/1000 >= 1){  
        $count = preg_replace('/(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))/', ',', $count);  
    }
    return $count;  
}

/**
 * 阿拉伯数字转中文大写金额
 * @param $num
 * @param bool|true $mode   模式(true 元 / false 点)
 * @param bool|true $sim    中文大小写(true 一 / false 壹)
 * @return string
 */
function numToCNMoney($num, $mode = true, $sim = true){
   if(!is_numeric($num)) return '含有非数字非小数点字符!';
   $char = $sim ? ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] : 
      ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
   $unit = $sim ? ['', '十', '百', '千', '', '万', '亿', '兆'] : 
      ['', '拾', '佰', '仟', '', '萬', '億', '兆'];
   $retval = $mode ? '元' : '点';
   //小数部分
   if(strpos($num, '.')){
      list($num,$dec) = explode('.', $num);
      $dec = strval(round($dec,2));
      if($mode){
         $retval .= "{$char[$dec['0']]}角{$char[$dec['1']]}分";
      }else{
         for($i = 0,$c = strlen($dec);$i < $c;$i++) {
            $retval .= $char[$dec[$i]];
         }
      }
   }
   //整数部分
   $str = $mode ? strrev(intval($num)) : strrev($num);
   for($i = 0,$c = strlen($str);$i < $c;$i++) {
      $out[$i] = $char[$str[$i]];
      if($mode){
         $out[$i] .= $str[$i] != '0'? $unit[$i%4] : '';
         if($i>1 and $str[$i]+$str[$i-1] == 0){
            $out[$i] = '';
         }
         if($i%4 == 0){
            $out[$i] .= $unit[4+floor($i/4)];
         }
      }
   }
   $retval = join('', array_reverse($out)) . $retval;
   return $retval;
}

/**
 * 获取在线IP
 * @return string
 */
function getIP(){
    $ip="0.0.0.0";
    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'];
    }
    preg_match("/[\d\.]{7,15}/", $ip, $onlineipmatches);
    $ip = $onlineipmatches[0] ? $onlineipmatches[0] : '0.0.0.0';
    unset($onlineipmatches);
    return $ip;
}

/**
 * 手机号隐藏(指定位置用星号'*'或特殊字符代替)
 * @param $mobile           手机号
 * @param string $symbol    替代符
 * @param int $start        开始位置
 * @param int $length       替换长度
 * @return mixed
 * @example    hideMobile('18161295668', '*', 3, 5);
 */
function hideMobile($mobile, $symbol = '*', $start = 1, $length = 1){
   $nsymbol = $symbol;
   $len = strlen($mobile);
   if(($len > $length) && (($start + $length) <= $len)){
      for($i = 0; $i < $length - 1; $i++){
         $nsymbol .= '*';
      }
      $mobile = substr_replace($mobile, $nsymbol, $start, $length);
   }
   return $mobile;
}

/**
   * 判断url是否带参数并返回连接符
* @param  string   $url 网址字串 
   * @return string    返回参数连接符 ? 或 &
   */
function getSymbol($url){
   return ((strpos($url, '?') !== false) ? '&' : '?'); 
}

/**
 * 判断url是否带有井号(#)
 * @param $url  网址字串
 * @return bool
 */
function hasHash($url){
    return ((strpos($url, '#') !== false) ? true : false); 
}

/**
 * 从网址字串中获取参数值
 * @param $url      网址字串
 * @return array    参数及参数值数组
 */
function getUrlStrParam($url){
   $data = array();
   $param = explode('?', $url);
   $parameter = explode('&', end($param));
   foreach($parameter as $val){
      $tmp = explode('=', $val);
      if(isset($tmp[0]) && isset($tmp[1])){
         $data[$tmp[0]] = $tmp[1];
      }
   }
   return $data;
}

/** 
 * 从网址字串中获取文件名 
 * @param  string $url    网址字串
 * @return  string
 */
function getUrlStrFileName($url){
   $expSprit = explode('/', $url);
   $fileName = end($expSprit); //将数组内部指针指向最后一个元素,并返回该元素的值(如果成功)
   if(strpos($url, '?') !== false){
      //带参数
      $expQue   = explode('?', $fileName);
      $fileName = reset($expQue); //将数组内部指针指向第一个元素,并返回该元素的值(如果成功)
   }else{    
      if(hasHash($fileName)){
         //带井号
         $expHash  = explode('#', $fileName);
         $fileName = reset($expHash);
      }
   }
   return $fileName;
}

/** 
 * 获取文件扩展名 
 * @param  string $FileName 文件全名 
 * @return  string
 */
function getFileExt($fileName){
   $expDot  = explode('.', $fileName);
   $fileExt = array_pop($expDot); //删除数组中的最后一个元素
   //$fileExt = end($expDot); //将数组内部指针指向最后一个元素 array_pop 、 end 返回结果一样
   $fileExt = trim($fileExt);
   $fileExt = '.' . strtolower($fileExt);
   return $fileExt;
}

/**
 * 铭感词过滤 加空格
 * @param $dirtyFile    铭感词文件路径
 * @param $string       原字串
 * @return mixed|string
 */
function filterBadWords($dirtyFile, $string){
   $dirtyWord = file_get_contents($dirtyFile); //说明:铭感词之间以英文逗号,分隔并且是base64字串
   $keyArr = explode(',', base64_decode($dirtyWord)); //base64解码并将字符分割为数组
   preg_match_all("/./us", $string, $match);
   $strLen = count($match[0]); //原字符长度(字符个数)
   $strNum = 0;
   $newStr = '';
   foreach($keyArr as $key){
      if(strpos($string, $key) !== false){
         $num = substr_count($string, $key); //计算字串出现的次数
         preg_match_all("/./us", $key, $_match);
         $keyLen = count($_match[0]);
         $nkey = mb_substr($key, 0, $keyLen-1, 'utf-8') . ' '. mb_substr($key, $keyLen-1, $keyLen, 'utf-8');
         $newStr .= str_replace($key, $nkey, $string); //替换字符
         $newStr = str_replace($key, $nkey, $newStr);
         $strNum += $num;
      }     
   }
   $newStr = mb_substr($newStr, 0, $strLen+$strNum, 'utf-8');
   return empty($newStr) ? $string : $newStr;
}

/**
 * 检测字串中是否存在某些字符
 * @param $str      字符串
 * @param $fstr     要查找的字符(多个用,隔开)
 * @return bool
 */
function strExists($str, $fstr){
   if(!is_string($str)){
      die('The first parameter is not a string.');
   }
   $keyArr = explode(',', $fstr); //将字符分割为数组
   $i = 0;
   foreach($keyArr as $key){
      if(strpos($str, $key) !== false){
         $i++;
      }     
   }
   return ($i > 0) ? true : false;
}

/**
 * 计算中文字符串长度  字符个数(非字节数)
 * @param null $string
 * @return int
 */
function utf8StrLen($string = null) {
   preg_match_all("/./us", $string, $match); //将字符串分解为单元
   return count($match[0]); //返回单元个数
}

/**
 * 检测是否有连续的字符
 * @param $str      字符串
 * @param $len      连续长度
 * @return bool
 */
function seriesExists($str, $len){
   return (preg_match("/([\x{4e00}-\x{9fa5}])\\1{".($len-1).",}/u", $str) == 1) ? true : false;
}

/**
 * 删除所有空目录
 * 使用shell则简单很多:find 目标文件夹 -mindepth 1 -depth -empty -type d -exec rm -r {} \;
 * @param $path
 */
function rmEmptyDir($path){
   if(is_dir($path) && ($handle = opendir($path))!==false){
      while(($file=readdir($handle))!==false){// 遍历文件夹
         if($file!='.' && $file!='..'){
            $curfile = $path.'/'.$file;// 当前目录
            if(is_dir($curfile)){// 目录
               rm_empty_dir($curfile);// 如果是目录则继续遍历
               if(count(scandir($curfile))==2){//目录为空,=2是因为.和..存在
                  rmdir($curfile);// 删除空目录
               }
            }
         }
      }
      closedir($handle);
   }
}

/**
 * 文件或目录权限检查函数
 * @param $filePath     文件路径
 * @return bool|int     返回值的取值范围为{0 <= x <= 15},每个值表示的含义可由四位二进制数组合推出。
 *                      返回值在二进制计数法中,四位由高到低分别代表
 *                      可执行rename()函数权限、可对文件追加内容权限、可写入文件权限、可读取文件权限。
 */
function fileModeInfo($filePath){
   //如果不存在,则不可读、不可写、不可改
   if(!file_exists($filePath)){
      return false;
   }
   $mark = 0;
   if(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'){
      //测试文件
      $testFile = $filePath . '/cf_test.txt';
      //如果是目录
      if(is_dir($filePath)){
         //检查目录是否可读
         $dir = @opendir($filePath);
         if($dir === false){
            return $mark; //如果目录打开失败,直接返回目录不可修改、不可写、不可读
         }
         if(@readdir($dir) !== false){
            $mark ^= 1; //目录可读 001,目录不可读 000
         }
         @closedir($dir);
         //检查目录是否可写
         $fp = @fopen($testFile, 'wb');
         if($fp === false){
            return $mark; //如果目录中的文件创建失败,返回不可写。
         }
         if(@fwrite($fp, 'directory access testing.') !== false){
            $mark ^= 2; //目录可写可读011,目录可写不可读 010
         }
         @fclose($fp);
         @unlink($testFile);
         //检查目录是否可修改
         $fp = @fopen($testFile, 'ab+');
         if($fp === false){
            return $mark;
         }
         if(@fwrite($fp, "modify test.\r\n") !== false){
            $mark ^= 4;
         }
         @fclose($fp);
         //检查目录下是否有执行rename()函数的权限
         if(@rename($testFile, $testFile) !== false){
            $mark ^= 8;
         }
         @unlink($testFile);
      }
      //如果是文件
      elseif (is_file($filePath)){
         //以读方式打开
         $fp = @fopen($filePath, 'rb');
         if($fp){
            $mark ^= 1; //可读 001
         }
         @fclose($fp);
         //试着修改文件
         $fp = @fopen($filePath, 'ab+');
         if($fp && @fwrite($fp, '') !== false){
            $mark ^= 6; //可修改可写可读 111,不可修改可写可读011...
         }
         @fclose($fp);
         //检查目录下是否有执行rename()函数的权限
         if(@rename($testFile, $testFile) !== false){
            $mark ^= 8;
         }
      }
   }else{
      if(@is_readable($filePath)){
         $mark ^= 1;
      }
      if(@is_writable($filePath)){
         $mark ^= 14;
      }
   }
   return $mark;
}

/**
 * 读取CSV文件中的某几行数据
 * @param $csvFile      csv文件路径
 * @param $lines        读取行数
 * @param int $offset   起始行数
 * @return array|bool
 */
function csvGetLines($csvFile, $lines, $offset = 0) {
   if(!$fp = fopen($csvFile, 'r')) {
      return false;
   }
   $i = $j = 0;
   while (false !== ($line = fgets($fp))) {
      if($i++ < $offset) {
         continue;
      }
      break;
   }
   $data = array();
   while(($j++ < $lines) && !feof($fp)) {
      $data[] = fgetcsv($fp);
   }
   fclose($fp);
   return $data;
}

/**
 * 二维数组数据分组聚合
 * @param $arr      数据数组
 * @param $gkey     分组键值
 * @return array
 */
function arrayGroup($arr, $gkey){
   $kArr = array();
   $gArr = array();
   $nArr = array();
   foreach($arr as $key => $val){
      if(!in_array($val[$gkey], $kArr)){
         $ukey = count($kArr);
         $kArr[] = $val[$gkey];
         $gArr[$ukey][] = $val;
      }else{
         $ukey = array_search($val[$gkey], $kArr);
         $gArr[$ukey][] = $val;
      }
   }
   foreach($gArr as $key => $val){
      if(is_array($val)){
         foreach($val as $k => $v){
            array_push($nArr, $v);
         }
      }
   }
   return $nArr;
}

/**
 * 字符加密、解密(解密必须知道加密秘钥,否则无法解密)
 * @param $string         字符串
 * @param string $type    类型(E加密 / D解密)
 * @param string $key     秘钥
 * @return mixed|string
 */
function encrypt($string, $type = 'E', $key = '') {
   $key = md5($key);
   $key_length = strlen($key);
   $string = $type == 'D' ? base64_decode($string) : substr(md5($string.$key),0,8).$string;
   $string_length = strlen($string);
   $rndkey = $box = array();
   $result = '';
   for($i=0; $i<=255; $i++){
      $rndkey[$i] = ord($key[$i%$key_length]);
      $box[$i] = $i;
   }
   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($type=='D'){
      if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
         return substr($result,8);
      }else{
         return '';
      }
   }else{
      return str_replace('=','',base64_encode($result));
   }
}
0

0 条评论

    没有找到数据。

发表评论

kyle
土豪

kyle

注册时间:2016-10-28
最后登录:6小时前
发布
带到手机上看