• php 一些神奇加有趣的函数


    php里面神奇且又有趣的函数

    • 这么有意思的title,我忍不住要啰嗦俩句,1--只是个人喜欢,不喜勿喷;2--仅个人笔记,未完,待续

    列举

    • get_defined_constants;get_defined_constants()获取php中的常量
    • mb_detect_encoding;mb_detect_encoding($handle)获取文件编码

    获取数组层数

    /**
    
     * 返回数组维数(层级)
    
     * @author echo* @param array $arr
    
     * @return int
    
     */
    
    function GetArrLv($arr) {
    
        if (is_array($arr)) {       
    
            #递归将所有值置NULL,目的1、消除虚构层如array("array(
      ()"),2、print_r 输出轻松点,
    
            array_walk_recursive($arr, function(&$val){ $val = NULL; });
            $ma = array();
            #从行首匹配[空白]至第一个左括号,要使用多行开关'm'
            preg_match_all("'^(|^s+('m", print_r($arr, true), $ma);
    
            #回调转字符串长度
            //$arr_size = array_map('strlen', current($ma));
            #取出最大长度并减掉左括号占用的一位长度
            //$max_size = max($arr_size) - 1;
            #数组层间距以 8 个空格列,这里要加 1 个是因为 print_r 打印的第一层左括号在行首
            //return $max_size / 8 + 1;
    
            return (max(array_map('strlen', current($ma))) - 1) / 8 + 1;
        } else {
    
            return 0;
        }
    }
    
    $arr = array(array(1,2=>array(1,2,3)),2=>array(1=>array(array(array())),2),3);
    echo GetArrLv($arr);
    

    数组循环,引用传递

    echo "<pre>";
    $arr = [1,2,3];
    foreach ($arr as $key => &$value){}
    foreach ($arr as $key => $value){
        //print_r($arr);
    };
    echo $key;
    echo $value;
    print_r($arr);
    exit;//1,2,2
    

    原因如下:

    • 无论foreach($arr as $key=>$value){}还是foreach ($arr as $key=>&$value){},最后都无法释放$key和$value变量指向的内存地址;
    • 所以$key为数组中最后一个元素的键名;
    • 引用不是复制,foreach ($arr as &$value){}执行后$value为数组中最后一个元素的引用。于是,最后$value变量和$arr[count($arr)-1]这个变量指向了同一个内存地址。两者一改都改。
    • 非引用遍历是复制出$arr的值给$value;两者指向不同的内存地址,所以改变$value或者$arr对其他没有任何的影响。

    温馨提示

    • 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset($arr)。
    • 由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。
    • 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset($value) 来将其销毁。

    分割字符串为数组

    function mb_str_split($str,$split_length=1,$charset="UTF-8"){
      if(func_num_args()==1){
        return preg_split('/(?<!^)(?!$)/u', $str);
      }
      if($split_length<1)return false;
      $len = mb_strlen($str, $charset);
      $arr = array();
      for($i=0;$i<$len;$i+=$split_length){
        $s = mb_substr($str, $i, $split_length, $charset);
        $arr[] = $s;
      }
      return $arr;
    }
    

    格式化memory_get_usage()输出

    //说明:memory_get_usage()函数输出的数值为bytes单位
    function convert($size){
        $unit = array('b','kb','mb','gb','tb','pb'); 
        return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
        //pow返回次方的幂round对浮点数进行四舍五入floor舍弃小数取整log返回自然对数
        //return一个值,用round对值四舍五入,保留两位数,第一个参数是$size除以,使用log返回参数与1024的对数,
        //用floor舍弃小数在返回1024的次方被参数除掉round四舍五入保留两位小数
    } 
    

    检查字符串是否是UTF8编码

    function is_utf8($string) {
        return preg_match('%^(?:
             [x09x0Ax0Dx20-x7E]            # ASCII
           | [xC2-xDF][x80-xBF]             # non-overlong 2-byte
           |  xE0[xA0-xBF][x80-xBF]        # excluding overlongs
           | [xE1-xECxEExEF][x80-xBF]{2}  # straight 3-byte
           |  xED[x80-x9F][x80-xBF]        # excluding surrogates
           |  xF0[x90-xBF][x80-xBF]{2}     # planes 1-3
           | [xF1-xF3][x80-xBF]{3}          # planes 4-15
           |  xF4[x80-x8F][x80-xBF]{2}     # plane 16
        )*$%xs', $string);
    }
    

    自动转换字符集 支持数组转换

    function auto_charset($fContents, $from='gbk', $to='utf-8') {
        $from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;
        $to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;
        if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {
            //如果编码相同或者非字符串标量则不转换
            return $fContents;
        }
        if (is_string($fContents)) {
            if (function_exists('mb_convert_encoding')) {
                return mb_convert_encoding($fContents, $to, $from);
            } elseif (function_exists('iconv')) {
                return iconv($from, $to, $fContents);
            } else {
                return $fContents;
            }
        } elseif (is_array($fContents)) {
            foreach ($fContents as $key => $val) {
                $_key = auto_charset($key, $from, $to);
                $fContents[$_key] = auto_charset($val, $from, $to);
                if ($key != $_key)
                    unset($fContents[$key]);
            }
            return $fContents;
        }
        else {
            return $fContents;
        }
    }
    

    输出带微妙的时间

    <?php
    date_default_timezone_set('PRC');
    function udate($format='Y-m-d H:i:s.u', $utimestamp='') {
        empty($utimestamp) && $utimestamp = microtime(true);
        $timestamp = floor($utimestamp);
        $milliseconds = round(($utimestamp - $timestamp) * 1000000);
        return date(preg_replace('#(?<!\\)u#', $milliseconds, $format), $timestamp);
    }
    echo udate('H:i:s.u'); // 12:33:03.599516
    echo udate('Y-m-d H:i:s.u'); // 2016-10-16 12:33:03.599684
    echo udate('Y-m-d H:i:s.u', 1234567890.654321); // 2009-02-14 07:31:30.654321
    

    cli模式下获取服务器ip

    function getServerIp()
    {
        if (!preg_match("/cli/i", php_sapi_name())) {
            return '';
        }
    
        $arr = [];
        $ip_cmd = "ifconfig eth0|grep inet|grep -v inet6|grep -v 127*|awk '{print $2}'|tr -d 'addr:'";
        exec($ip_cmd, $arr, $suc);
        if ($suc) {
            return false;
        }
        if (!empty($arr) && !empty($arr[0])) {
            return trim($arr[0]);
        }
    
        $arr = [];
        $ip_cmd = "ip a|grep inet|grep -v inet6|grep -v 127*|awk '{print $2}'|awk -F '/' '{print $1}'";
        exec($ip_cmd, $arr, $suc);
        if (!empty($arr) && !empty($arr[0])) {
            return trim($arr[0]);
        }
        return '';
    }
    

    扩展阅读

  • 相关阅读:
    操作系统原理5——文件管理
    Hadoop worldcount
    Java Future源码分析
    HBase入门教程
    Java自定义cas操作
    dubbo客户端源码分析(一)
    log4j2配置文件
    paxos协议
    Guava限流工具RateLimiter使用
    jvm内置锁synchronized不能被中断
  • 原文地址:https://www.cnblogs.com/jjxhp/p/11703427.html
Copyright © 2020-2023  润新知