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 一些神奇加有趣的函数的更多相关文章

  1. php js css加载合并函数 宋正河整理

    <?php //php js css加载合并函数 宋正河整理 //转载请注明出处 define('COMBINE_JS',true); define('COMBINE_CSS',true);   ...

  2. JS,Javascript加载与函数执行过程

    Js,Javascript加载与函数执行过程 test.html <!DOCTYPE HTML> <html lang="en"> <head> ...

  3. js匿名函数(变量加括号就是函数)

    js匿名函数(变量加括号就是函数) 一.总结 变量加括号就是函数,而函数的括号是用来传参的 1.类比:以正常函数去想匿名函数,匿名函数比正常函数只是少了函数名,本质还是一样,该怎么传参还是怎么传参,小 ...

  4. ThinkPHP 3.2.3 自动加载公共函数文件的方法

    方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件 ...

  5. 学习 easyui 之二:jQuery 的 ready 函数和 easyloader 的加载回调函数

    Ready 事件不一定 ready 使用 easyloader 的时候,必须要注意到脚本的加载时机问题,easyloader 会异步加载模块,所以,你使用的模块不一定已经加载了.比如下面的代码. &l ...

  6. 康盛(discuz )牛逼的PHP加解密算法函数

    1.前言 康盛的 authcode 函数很牛叉,是一个具有有效期的加解密函数,同一个字符每次加密所产生的结果都是不一致的,并且可以自定义设置过期时间. 设计原理:authcode 是使用异或运算进行加 ...

  7. ThinkPHP3自动加载公共函数文件

    7d 根目录 ├─Application 应用目录 │ ├─Common 公共模块 │ │ ├─Common 公共函数文件目录 │ │ │ ├─index.html │ │ ├─Config 配置文件 ...

  8. 动态加载JS函数

    一般性的,当我们需要加载js文件的时候都会使用script标签来实现,类似于如下代码: 代码如下: <script type="text/javascript" src=&q ...

  9. objectARX加载lisp函数、源码的一种方式

    //感谢高飞鸟highflybird版主的思路以及研究. //先声明非公开函数acedEvaluateLisp extern int acedEvaluateLisp(const ACHAR*,str ...

随机推荐

  1. MySQL注入流程

    目录 确认注入点 信息收集 数据获取 提权 写个MySQL注入流程的大纲,类似一份全局地图,能指导下一步工作.MySQL注入流程分为四步: 确认注入点 信息收集 数据获取 提权 确认注入点 参考:ht ...

  2. iOS之CoreBluetooth

    思路 手机与设备间的通讯方式CoreBluetooth是比较常见且通用的.在iOS开发中需明晰以下几点 蓝牙4.0最多可联机7个设备,iPhone6以上都是蓝牙4.0 两台iPhone并不直接通过蓝牙 ...

  3. SQL学习笔记——创建数据库显示:文件激活错误,物理文件名不存在>>解决方案

    今天在创建数据库时,跟着老师一步一步的操作创建成功,但出于在厌恶冗长的数据库存储路径,于是,擅自更改了数据filename,让他保存在电脑桌面新建的文件夹,可是一执行就报错了. 老师源码: 1 cre ...

  4. js 浮点运算bug

    js几个浮点运算的bug,比如6.9-1.1,7*0.8,2.1/0.3,2.2+2.1 实现思路 通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了 比如:1 ...

  5. Mybatis系列全解(三):Mybatis简单CRUD使用介绍

    封面:洛小汐 作者:潘潘 在理解中执行,在执行中理解,学习技术也循此道. 前言 上一篇文章 <Mybatis系列全解(二):Mybatis简介与环境搭建> ,我们对 Mybatis 做了初 ...

  6. python 操作符** (两个乘号就是乘方)

    一个乘号*,如果操作数是两个数字,就是这两个数字相乘,如2*4,结果为8**两个乘号就是乘方.比如3**4,结果就是3的4次方,结果是81 *如果是字符串.列表.元组与一个整数N相乘,返回一个其所有元 ...

  7. Linux系统用户与用户组管理

    一.用户和用户组的管理 1.新增组 groupadd 命令 格式:groupadd 组名 2.删除组 groupdel 格式:groupdel 组名 3.增加用用户命令 useradd   格式:us ...

  8. Kotlin/Java Base64编码和解码(图片、文件)

    原文: Kotlin/Java Base64编码和解码(图片.文件) | Stars-One的杂货小窝 最近在项目中使用到了Base64编码和解码,便是稍微写篇文章记录一下 PS:本文代码都是使用Ko ...

  9. U盘重装系统:手把手教你怎么使用U盘重装系统、清除登录密码

    前言 之前讲过<不懂电脑也能自己重装系统,可视化傻瓜式一键重装系统不求人!!!>,这是针对可以正常开机的情况下直接使用浏览器功能重装系统, 那不能正常开机或者忘记密码的怎么办呢? 不慌,今 ...

  10. js 算数组平均值、最大值、最小值、偏差、标准差、中位数、数组从小打大排序、上四分位数、下四分位数

    要算的数组命名为data var sum = function(x,y){ return x+y;}; //求和函数 var square = function(x){ return x*x;}; / ...