php常考功能函数

Posted 哈利路亚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php常考功能函数相关的知识,希望对你有一定的参考价值。

1.统计数组元素个数

$arr = array(
   \'1011,1003,1008,1001,1000,1004,1012\',
   \'1009\',
   \'1011,1003,1111\'
  );
$result = array();
foreach ($arr as $str) {
 $str_arr = explode(\',\', $str);
 foreach ($str_arr as $v) {
  // $result[$v] = isset($result[$v]) ? $result[$v] : 0;
  // $result[$v] = $result[$v] + 1;
  $result[$v] = isset($result[$v]) ? $result[$v]+1 : 1;
 }
}
print_r($result);
//Array
(
[1011] => 2
[1003] => 2
[1008] => 1
[1001] => 1
[1000] => 1
[1004] => 1
[1012] => 1
[1009] => 1
[1111] => 1
)

2. 循环删除目录

function cleanup_directory($dir) {
 foreach (new DirectoryIterator($dir) as $file) {
  if ($file->isDir()) {
   if (! $file->isDot()) {
    cleanup_directory($file->getPathname());
   }
  } else {
    unlink($file->getPathname());
  }
 }
  rmdir($dir);
}

3.无限极分类生成树

function generateTree($items){
  $tree = array();
  foreach($items as $item){
    if(isset($items[$item[\'pid\']])){
      $items[$item[\'pid\']][\'son\'][] = &$items[$item[\'id\']];
    }else{
      $tree[] = &$items[$item[\'id\']];
    }
  }
  return $tree;
}
function generateTree2($items){
  foreach($items as $item)
    $items[$item[\'pid\']][\'son\'][$item[\'id\']] = &$items[$item[\'id\']];
  return isset($items[0][\'son\']) ? $items[0][\'son\'] : array();
}
 
$items = array(
  1 => array(\'id\' => 1, \'pid\' => 0, \'name\' => \'安徽省\'),
  2 => array(\'id\' => 2, \'pid\' => 0, \'name\' => \'浙江省\'),
  3 => array(\'id\' => 3, \'pid\' => 1, \'name\' => \'合肥市\'),
  4 => array(\'id\' => 4, \'pid\' => 3, \'name\' => \'长丰县\'),
  5 => array(\'id\' => 5, \'pid\' => 1, \'name\' => \'安庆市\'),
);
print_r(generateTree($items));
/**
 * 如何取数据格式化的树形数据
 */
$tree = generateTree($items);
function getTreeData($tree){
  foreach($tree as $t){
    echo $t[\'name\'].\'<br>\';
    if(isset($t[\'son\'])){
      getTreeData($t[\'son\']);
    }
  }
}
View Code

4.数组排序 a - b 是数字数组写法 遇到字符串的时候就要

 1 var test = [\'ab\', \'ac\', \'bd\', \'bc\'];
 2 test.sort(function(a, b) {
 3   if(a < b) {
 4     return -1;
 5   }
 6  
 7   if(a > b) {
 8     return 1;
 9   }
10  
11   return 0;
12 });
View Code

5.array_reduce

$raw = [1,2,3,4,5,];
// array_reduce 的第三个参数是 $result 的初始值
array_reduce($raw, function($result, $value) {
  $result[$value] = $value;
 
  return $result;
}, []);
// [1 => 1, 2 => 2, ... 5 => 5]
View Code

6.array_map 闭包中只接受一个或者多个参数,闭包的参数数量和 array_map 本身的参数数量必须一致

$input = [\'key\' => \'value\'];
array_map(function($key, $value) {
 
  echo $key . $value;
}, array_keys($input), $input)
// \'keyvalue\'
$double = function($item) {
 return 2 * $item;
}
 
$result = array_map($double, [1,2,3]);
 
// 2 4 6
View Code

7.繁殖兔子

$month = 12;
  $fab = array();
 
  $fab[0] = 1;
  $fab[1] = 1;
 
   for ($i = 2; $i < $month; $i++)
   {
     $fab[$i] = $fab[$i - 1] + $fab[$i - 2];
   }
 
   for ($i = 0; $i < $month; $i++)
   {
     echo sprintf("第{%d}个月兔子为:{%d}",$i, $fab[$i])."<br/>";
   }

8 .datetime

function getCurMonthFirstDay($date)
{
  return date(\'Y-m-01\', strtotime($date));
}
 getCurMonthLastDay(\'2015-07-23\')
function getCurMonthLastDay($date)
{
  return date(\'Y-m-d\', strtotime(date(\'Y-m-01\', strtotime($date)) . \' +1 month -1 day\'));
}
View Code

9.加密解密

function encrypt($data, $key)
{
  $key  =  md5($key);
  $x   =  0;
  $len  =  strlen($data);
  $l   =  strlen($key);
  $char  =  \'\';
  for ($i = 0; $i < $len; $i++)
  {
    if ($x == $l)
    {
      $x = 0;
    }
    $char .= $key{$x};
    $x++;
  }
  $str  =  \'\';
  for ($i = 0; $i < $len; $i++)
  {
    $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
  }
  return base64_encode($str);
}
 
function decrypt($data, $key)
{
  $key = md5($key);
  $x = 0;
  $data = base64_decode($data);
  $len = strlen($data);
  $l = strlen($key);
  $char = \'\';
  for ($i = 0; $i < $len; $i++)
  {
    if ($x == $l)
    {
      $x = 0;
    }
    $char .= substr($key, $x, 1);
    $x++;
  }
  $str = \'\';
  for ($i = 0; $i < $len; $i++)
  {
    if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
    {
      $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
    }
    else
    {
      $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
    }
  }
  return $str;
}
View Code

10 . 多维数组降级

function array_flatten($arr) {
  $result = [];
 
  array_walk_recursive($arr, function($value) use (&$result) {
    $result[] = $value;
  });
 
  return $result;
}
print_r(array_flatten([1,[2,3],[4,5]]));// [1,[2,3],[4,5]] => [1,2,3,4,5]
// var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
var test = [1,2,3,[4,5,6],[7,8]];
[].concat.apply([], test); // [1,2,3,4,5,6,7,8] 对于 test 数组中的每一个 value, 将它 concat 到空数组 [] 中去,而因为 concat 是 Array 的 prototype,所以我们用一个空 array 作载体
var test1 = [1,2,[3,[4,[5]]]];
 
function flatten(arr) {
  return arr.reduce(function(pre, cur) {
    if(Array.isArray(cur)) {
      return flatten(pre.concat(cur));
    }
 
    return pre.concat(cur);
  }, []);
}
 
// [1,2,3,4,5]
json_encode中文
function json_encode_wrapper ($result)
{
  if(defined(\'JSON_UNESCAPED_UNICODE\')){
    return json_encode($result,JSON_UNESCAPED_UNICODE|JSON_NUMERIC_CHECK);
  }else {
    return preg_replace(
      array("#\\\\\\u([0-9a-f][0-9a-f][0-9a-f][0-9a-f])#ie", "/\\"(\\d+)\\"/",),
      array("iconv(\'UCS-2\', \'UTF-8\', pack(\'H4\', \'\\\\1\'))", "\\\\1"),
      json_encode($result)
    );
  }
}
View Code

12.二维数组去重

$arr = array(
 
  array(\'id\'=>\'2\',\'title\'=>\'...\',\'ding\'=>\'1\',\'jing\'=>\'1\',\'time\'=>\'...\',\'url\'=>\'...\',\'dj\'=>\'...\'),
 
  array(\'id\'=>\'2\',\'title\'=>\'...\',\'ding\'=>\'1\',\'jing\'=>\'1\',\'time\'=>\'...\',\'url\'=>\'...\',\'dj\'=>\'...\')
 
);
function about_unique($arr=array()){ 
  /*将该种二维数组看成一维数组,则   该一维数组的value值有相同的则干掉只留一个,并将该一维   数组用重排后的索引数组返回,而返回的一维数组中的每个元素都是   原始key值形成的关联数组  */ 
$keys =array();
  $temp = array();
  foreach($arr[0] as $k=>$arrays) {
  /*数组记录下关联数组的key值*/  
  $keys[] = $k;
  }
  //return $keys;  /*降维*/  
foreach($arr as $k=>$v) {
  $v = join(",",$v); //降维   
  $temp[] = $v;
  }
  $temp = array_unique($temp); //去掉重复的内容  
foreach ($temp as $k => $v){
  /*再将拆开的数组按索引数组重新组装*/  
  $temp[$k] = explode(",",$v); 
  } 
  //return $temp;  /*再将拆开的数组按关联数组key值重新组装*/  
foreach($temp as $k=>$v) {
  foreach($v as $kkk=>$ck) {
   $data[$k][$keys[$kkk]] = $temp[$k][$kkk];
  }
  }
  return $data;
 }
View Code

13.格式化字节大小

/**
* 格式化字节大小
* @param number $size   字节数
* @param string $delimiter 数字和单位分隔符
* @return string      格式化后的带单位的大小
* @author 
*/
function format_bytes($size, $delimiter = \'\') {
 $units = array(\'B\', \'KB\', \'MB\', \'GB\', \'TB\', \'PB\');
 for ($i = 0; $size >= 1024 && $i < 6; $i++) $size /= 1024;
 return round($size, 2) . $delimiter . $units[$i];
}
View Code

14.3分钟前

/**
* 将指定时间戳转换为截止当前的xx时间前的格式 例如 return \'3分钟前\'\'
* @param string|int $timestamp unix时间戳
* @return string
*/
function time_ago($timestamp) {
  $etime = time() - $timestamp;
  if ($etime < 1) return \'刚刚\';   
  $interval = array (     
   12 * 30 * 24 * 60 * 60 => \'年前 (\'.date(\'Y-m-d\', $timestamp).\')\',
   30 * 24 * 60 * 60    => \'个月前 (\'.date(\'m-d\', $timestamp).\')\',
   7 * 24 * 60 * 60    => \'周前 (\'.date(\'m-d\', $timestamp).\')\',
   24 * 60 * 60      => \'天前\',
   60 * 60         => \'小时前\',
   60           => \'分钟前\',
   1            => \'秒前\'
  );
  foreach ($interval as $secs => $str) {
    $d = $etime / $secs;
    if ($d >= 1) {
      $r = round($d);
      return $r . $str;
    }
  };
}
View Code

15.身份证号

/**
* 判断参数字符串是否为天朝身份证号
* @param $id 需要被判断的字符串或数字
* @return mixed false 或 array[有内容的array boolean为真]
*/
function is_citizen_id($id) {
  //长度效验 18位身份证中的X为大写
  $id = strtoupper($id);
  if(!(preg_match(\'/^\\d{17}(\\d|X)$/\',$id) || preg_match(\'/^\\d{15}$/\',$id))) {
   return false;
  }
  //15位老号码转换为18位 并转换成字符串
  $Wi     = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1); 
  $Ai     = array(\'1\', \'0\', \'X\', \'9\', \'8\', \'7\', \'6\', \'5\', \'4\', \'3\', \'2\'); 
  $cardNoSum  = 0;
  if(strlen($id)==16) {
    $id    = substr(0, 6).\'19\'.substr(6, 9); 
    for($i = 0; $i < 17; $i++) {
     $cardNoSum += substr($id,$i,1) * $Wi[$i];
    } 
    $seq    = $cardNoSum % 11; 
    $id    = $id.$Ai[$seq];
  }
  //效验18位身份证最后一位字符的合法性
  $cardNoSum  = 0;
  $id17    = substr($id,0,17);
  $lastString = substr($id,17,1);
  for($i = 0; $i < 17; $i++) {
    $cardNoSum += substr($id,$i,1) * $Wi[$i];
  } 
  $seq     = $cardNoSum % 11;
  $realString = $Ai[$seq];
  if($lastString!=$realString) {return false;}
  //地域效验
  $oCity    = array(11=>"北京",12=>"天津",13=>"河北",14=>"山西",15=>"内蒙古",21=>"辽宁",22=>"吉林",23=>"黑龙江",31=>"上海",32=>"江苏",33=>"浙江",34=>"安徽",35=>"福建",36=>"江西",37=>"山东",41=>"河南",42=>"湖北",43=>"湖南",44=>"广东",45=>"广西",46=>"海南",50=>"重庆",51=>"四川",52=>"贵州",53=>"云南",54=>"西藏",61=>"陕西",62=>"甘肃",63=>"青海",64=>"宁夏",65=>"新疆",71=>"台湾",81=>"香港",82=>"澳门",91=>"国外");
  $City    = substr($id, 0, 2);
  $BirthYear  = substr($id, 6, 4);
  $BirthMonth = substr($id, 10, 2);
  $BirthDay  = substr($id, 12, 2);
  $Sex     = substr($id, 16,1) % 2 ;//男1 女0
  //$Sexcn    = $Sex?\'男\':\'女\';
  //地域验证
  if(is_null($oCity[$City])) {return false;}
  //出生日期效验
  if($BirthYear>2078 || $BirthYear<1900) {return false;}
  $RealDate  = strtotime($BirthYear.\'-\'.$BirthMonth.\'-\'.$BirthDay);
  if(date(\'Y\',$RealDate)!=$BirthYear || date(\'m\',$RealDate)!=$BirthMonth || date(\'d\',$RealDate)!=$BirthDay) {
    return false;
  }
  return array(\'id\'=>$id,\'location\'=>$oCity[$City],\'Y\'=>$BirthYear,\'m\'=>$BirthMonth,\'d\'=>$BirthDay,\'sex\'=>$Sex);
}
View Code

16.获取二维数组中某个key的集合

$user = array( 0 => array( \'id\' => 1, \'name\' => \'张三\', \'email\' => \'zhangsan@sina.com\', ), 1 => array( \'id\' => 2, \'name\' => \'李四\', \'email\' => \'lisi@163.com\', ), 2 => array( \'id\' => 5, \'name\' => \'王五\', \'email\' => \'10000@qq.com\', ), ...... );
$ids = array(); $ids = array_map(\'array_shift\', $user);
$ids = array_column($user, \'id\');//php5.5
$names = array(); $names = array_reduce($user, create_function(\'$v,$w\', \'$v[$w["id"]]=$w["name"];return $v;\'));

 

1、PHP加密解密
PHP加密和解密函数可以用来加密一些有用的字符串存放在数据库里,并且通过可逆解密字符串,该函数使用了base64和MD5加密和解密。

function encryptDecrypt($key, $string, $decrypt){ 
  if($decrypt){ 
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12"); 
    return $decrypted; 
  }else{ 
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); 
    return $encrypted; 
  } 
}
View Code

使用方法如下:
//以下是将字符串“Helloweba欢迎您”分别加密和解密
//加密:
echo encryptDecrypt(\'password\', \'jb51欢迎您\',0);
//解密:
echo encryptDecrypt(\'password\', \'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=\',1);

2、PHP生成随机字符串
当我们需要生成一个随机名字,临时密码等字符串时可以用到下面的函数:

function generateRandomString($length = 10) { 
  $characters = \'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\'; 
  $randomString = \'\'; 
  for ($i = 0; $i < $length; $i++) { 
    $randomString .= $characters[rand(0, strlen($characters) - 1)]; 
  } 
  return $randomString; 
}
View Code

使用方法如下:
echo generateRandomString(20);

3、PHP获取文件扩展名(后缀)
以下函数可以快速获取文件的扩展名即后缀。

function getExtension($filename){ 
 $myext = substr($filename, strrpos($filename, \'.\')); 
 return str_replace(\'.\',\'\',$myext); 
}

使用方法如下:

$filename = \'我的文档.doc\'; 
echo getExtension($filename);

4、PHP获取文件大小并格式化
以下使用的函数可以获取文件的大小,并且转换成便于阅读的KB,MB等格式。