• 技术文章 >后端开发 >php教程

    php基本函数汇总_php技巧

    2016-05-16 20:11:17原创588
    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'].'
    '; if(isset($t['son'])){ getTreeData($t['son']); } } }

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

    var test = ['ab', 'ac', 'bd', 'bc'];
    test.sort(function(a, b) {
      if(a < b) {
        return -1;
      }
    
      if(a > b) {
        return 1;
      }
    
      return 0;
    });
    
    

    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]
    
    

    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
    
    

    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])."
    "; }

    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'));
    }
    

    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;
    }
    
    

    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+)\"//m.sbmmt.com/m/",),
          array("iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", "\\1"),
          json_encode($result)
        );
      }
    }
    
    

    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;
     }
    
    

    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];
    }
    

    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;
        }
      };
    }
    

    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);
    }
    

    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;'));
    

    以上所述就是本文的全部内容了,希望大家能够喜欢。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 基本函数汇总
    上一篇:php判断linux下程序问题实例_php技巧 下一篇:php-redis中的sort排序函数总结_php技巧
    Web大前端开发直播班

    相关文章推荐

    • 详细介绍PHP的session反序列化漏洞• 关于字符串的操作,可能需要用到正则,觉得很复杂解决思路 • Composer PHP依赖管理的新时代• PHP_常用字符串处理函数• 求一个指定范围内多个不重复随机数~

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网