/**
* 将数值三位分割,加千分位的分隔符(多用于钱数,金额)
* @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 条评论