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(\n  ()"),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('%^(?:
         [\x09\x0A\x0D\x20-\x7E]            # ASCII
       | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
       |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
       | [\xE1-\xEC\xEE\xEF][\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 '';
}
扩展阅读
php 一些神奇加有趣的函数的更多相关文章
- php js css加载合并函数 宋正河整理
		<?php //php js css加载合并函数 宋正河整理 //转载请注明出处 define('COMBINE_JS',true); define('COMBINE_CSS',true); ... 
- JS,Javascript加载与函数执行过程
		Js,Javascript加载与函数执行过程 test.html <!DOCTYPE HTML> <html lang="en"> <head> ... 
- js匿名函数(变量加括号就是函数)
		js匿名函数(变量加括号就是函数) 一.总结 变量加括号就是函数,而函数的括号是用来传参的 1.类比:以正常函数去想匿名函数,匿名函数比正常函数只是少了函数名,本质还是一样,该怎么传参还是怎么传参,小 ... 
- ThinkPHP 3.2.3 自动加载公共函数文件的方法
		方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件 ... 
- 学习 easyui 之二:jQuery 的 ready 函数和 easyloader 的加载回调函数
		Ready 事件不一定 ready 使用 easyloader 的时候,必须要注意到脚本的加载时机问题,easyloader 会异步加载模块,所以,你使用的模块不一定已经加载了.比如下面的代码. &l ... 
- 康盛(discuz )牛逼的PHP加解密算法函数
		1.前言 康盛的 authcode 函数很牛叉,是一个具有有效期的加解密函数,同一个字符每次加密所产生的结果都是不一致的,并且可以自定义设置过期时间. 设计原理:authcode 是使用异或运算进行加 ... 
- ThinkPHP3自动加载公共函数文件
		7d 根目录 ├─Application 应用目录 │ ├─Common 公共模块 │ │ ├─Common 公共函数文件目录 │ │ │ ├─index.html │ │ ├─Config 配置文件 ... 
- 动态加载JS函数
		一般性的,当我们需要加载js文件的时候都会使用script标签来实现,类似于如下代码: 代码如下: <script type="text/javascript" src=&q ... 
- objectARX加载lisp函数、源码的一种方式
		//感谢高飞鸟highflybird版主的思路以及研究. //先声明非公开函数acedEvaluateLisp extern int acedEvaluateLisp(const ACHAR*,str ... 
随机推荐
- SpringBoot(六):SpringBoot中如何使用Servlet?
			第一种方法: 1.使用Servlet3的注解方式编写一个Servlet 2.在main方法的主类上添加注解: @ServletComponentScan(basePackages = "co ... 
- Java 队列同步器 AQS
			本文部分摘自<Java 并发编程的艺术> 概述 队列同步器 AbstractQueuedSynchronize(以下简称同步器),是用来构建锁(Lock)或者其他同步组件(JUC 并发包) ... 
- MySQL:事务机制
			为什么需要事务处理? 在执行SQL语句的时候,某些业务要求,一系列操作必须全部执行,而不能仅执行一部分. MySQL5.0后引入了事务机制,MySQL支持几种基本的数据库引擎,并非所有引擎都支持事务处 ... 
- Hi3559AV100外接UVC/MJPEG相机实时采图设计(二):V4L2接口的实现(以YUV422为例)
			下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ... 
- Redis之面试连环炮
			目录 1.简单介绍一下Redis 2.分布式缓存常见的技术选型方案有哪些? 3.Redis和Memcached的区别和共同点 4. 缓存数据的处理流程是怎样的? 5. 为什么要用 Redis/为什么要 ... 
- ES系列(一):编译准备与server启动过程解析
			ES作为强大的和流行的搜索引擎服务组件,为我们提供了方便的和高性能的搜索服务.在实际应用中也是用得比较爽,但如果能够更深入一点.虽然网上有许多的文章已经完整说明,ES是如何如何做到高性能,如何做到高可 ... 
- solr 远程代码执行(CVE-2019-12409)
			Apache Solr 远程代码执行漏洞(CVE-2019-12409) 简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.是apache的顶级开源项 ... 
- STL之string容器
			string string封装了char*,管理这个字符串,是一个char*型的容器. string的相关操作 头文件 #include<string> string构造函数 string ... 
- 你想知道的 std::vector::push_back 和 std::vector::emplace_back
			引言 C++ 11 后,标准库容器 std::vector 包含了成员函数 emplace 和 emplace_back.emplace 在容器指定位置插入元素,emplace_back 在容器末尾添 ... 
- 2019HDU多校第七场 HDU6646 A + B = C 【模拟】
			一.题目 A + B = C 二.分析 比较考验码力的题. 对于$c$,因为首位肯定不为0,那么$a$或者$b$至少有一个最高位是和$c$平齐的,或者少一位(相当于$a$+$b$进位得到). 那么这里 ... 
