PHP常用函数库整理

一、xml类型数据转成Array类型 

提示:可以使用PHP的内置函数simplexml_load_string()将xml格式类型的数据转换成object(对象)

coding:

<?php

/**
 * xml转array
 * @param  $xml   需要转换的xml数据
 * @return array  返回将xml转换后的数组
 * */
function xmlToArray($xml)
{
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $values = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);
    return $values;
}

?>

看到这种方式大家是不是恍然大悟。。 根本不需要各种for循环或者foreach循环。。


二、删除指定目录下的所有文件

经常需要删除指定目录下的文件,今天给封装了一个函数 记录下来 以后就直接拿来用了。。注意用到了PHP中的opendir()以及readdir()等函数

coding:

/**
 * 删除指定目录下的所有文件
 * @param  string  $dir 目录路径
 * @return bool
 * */
function delDirFile($dir)
{
    if(!is_dir($dir)) return false;

    $resource = opendir($dir);  //打开一个目录  

    while($file = readdir($resource))  
    {
        if($file != "." && $file != "..")
        {
            $fullpath = $dir.'/'.$file; //将当前传进来的目录以及读取到的当前文件进行拼接  

            if(!is_dir($fullpath)) //拼接后的$fullpath不是一个目录,则是文件,则删除当前文件
            {
                unlink($fullpath);
            }
        }
    }
}


三、计算两个日期之间相差多少天

这个也是挺常用的,比如说查看当前日期与某个用户的会员到期日期 还有几天。

coding:

/**计算两个日期之间的相差的天数
 * @param  int   $dateone  日期1(时间戳)
 * @param  int   $datetwo  日期2(时间戳)
 * @return float $days     相差之后的天数
 * */
function get_diff_date($dateone,$datetwo)
{
    $days = round( ($dateone - $datetwo) / 3600 / 24);

    return $days;
}


四、获取指定月份的第一天以及最后一天

coding:

/**获取指定月份的起始时间以及月份的最后一天
 * @param  string  $date //指定月份
 * @return array   返回指定月份的第一天以及最后一天
 * */
function get_month($date)
{
    $firstday = date('Y-m-01', strtotime($date)); //月初

    $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));//月末

    return array($firstday, $lastday);
}

//使用方法如下:
$date = '2018-02';
var_dump(get_month($date));

/*
  array (size=2)
  0 => string '2018-02-01' (length=10)
  1 => string '2018-02-28' (length=10)
*/


五、获取客户端访问者用户IP地址

coding:

/**
 * 获得客户端用户IP
 * @return string
 * @author Dacheng Chen(博主的一位女同事)
 * 
 * 一般做方可计数器时,大多都會利用PHP的$SERVER['REMOTE_ADDR']來抓取访客的IP地址,
 可是在书上发现REMOTE_ADDR不能抓取到有经过proxy(代理服务器)访客的真实IP,
 所以搭配利用$SERVER['HTTP_X_FORWARDED_FOR'],它可以将所有访客主机经过的代理主机IP记录下来,便可以抓到有经过proxy访客的真实IP。
 * 注意:以上这段解释不是本函数的作者写的  是博主自己写的。
 */

function get_user_ip()
{
    if(empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    {
        $ip_address = $_SERVER["REMOTE_ADDR"];
    }
    else
    {
        $ip_address = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }

    if(strpos($ip_address,',') !== false)
    {
        $ip_address = explode(',', $ip_address);
        $ip_address = $ip_address[0];
    }

    return $ip_address;
}


六、计算字符串的长度(包括中英数字混合情况)

coding:

/**
 * 计算字符串的长度(包括中英数字混合情况)
 *
 * @param   type $str
 * @return  int
 * @desc    zdm 非博主个人写的 以前company写好的
 */
function count_string_len($str)
{
    $name_len = strlen($str);
    $temp_len = 0;

    for($i = 0; $i < $name_len;)
    {
        if(strpos('abcdefghijklmnopqrstvuwxyz0123456789ABCDEFGHIJKLMNOPQRSTVUWXYZ_-', $str [$i]) === false)
        {
            $i = $i + 3;
            $temp_len += 2;
        }
        else
        {
            $i = $i + 1;
            $temp_len += 1;
        }
    }

    return $temp_len;
}


七、截取utf8编码字符串(包含中英文混合字符串)

coding:

/**
 * 截取UTF8编码字符串从首字节开始指定宽度(非长度), 适用于字符串长度有限的如新闻标题的等宽度截取
 * 中英文混排情况较理想. 全中文与全英文截取后对比显示宽度差异最大,且截取宽度远大越明显.
 * @param string $str   UTF-8 encoding
 * @param int[option] $width 截取宽度
 * @param string[option] $end 被截取后追加的尾字符
 * @param float[option] $x3<p>
 *  3字节(中文)字符相当于希腊字母宽度的系数coefficient(小数)
 *  中文通常固定用宋体,根据ascii字符字体宽度设定,不同浏览器可能会有不同显示效果</p>
 *
 * @return string
 * @author waiting
 * http://waiting.iteye.com
 * @desc zdm 非博主个人写的 以前company写好的
 */
function utf_substr($str, $width = 0,$end = '...',$x3 = 0)
{
    global $CFGX3; // 全局变量保存 x3 的值

    if ($width <= 0 || $width >= strlen($str))
    {
        return $str;
    }

    $e   = '';
    $arr = str_split($str);
    $len = count($arr);
    $w   = 0;
    $width *= 10;

    // 不同字节编码字符宽度系数
    $x1 = 11;   // ASCII
    $x2 = 16;
    $x3 = $x3 === 0 ? ( $CFGX3['cf3'] > 0 ? $CFGX3['cf3'] * 10 : $x3 = 21 ) : $x3 * 10;
    $x4 = $x3;

    // http://zh.wikipedia.org/zh-cn/UTF8
    for($i = 0; $i < $len; $i++)
    {
        if ($w >= $width)
        {
            $e = $end;
            break;
        }
        $c = ord($arr[$i]);
        if ($c <= 127)
        {
            $w += $x1;
        }
        elseif($c >= 192 && $c <= 223)
        {
            // 2字节头
            $w += $x2;
            $i += 1;
        }
        elseif($c >= 224 && $c <= 239)
        {
            // 3字节头
            $w += $x3;
            $i += 2;
        }
        elseif($c >= 240 && $c <= 247)
        {
            // 4字节头
            $w += $x4;
            $i += 3;
        }
    }

    return implode('',array_slice($arr, 0, $i)).$e;
}


八、将数组插入指定数组的位置中(二维)

coding:

/**
 * 将数组插入指定数组的位置中(二维)
 * @param  array $array       给哪个数组插入(二维)
 * @param  int   $position    在那个位置插入
 * @param  array $insert_aray 要插入的数组(二维)
 * @return array
 * @author 
 * @desc   zdm 非博主个人写的 以前同事写好的
 * @ 利用array_merge合并函数,合并的数组key是索引的特性以及array_splice函数将数组中指定位置的数组移除并返回移除的数组,
  *  注意:array_splice函数的第一个参数是引用传址,所以下面这个方法才好用~
 */
function array_insert($array,$position,$insert_array)
{
    $find_array = array_splice($array,0,$position);
    $array      = array_merge($find_array,$insert_array,$array); 

    return $array;
}

以上函数只测试过二维数组

//调用示例:
$this->array_insert($banner_list,1,[$advert[0]]); //向$banner_list数组中的第2个位置插入$advert数组


九、获取两个日期之间的所有日期

函数简介:

有时候我们想得到两个日期之间的所有日期

例如:

输入两个日期,把这两个日期之间的所有日期取出来   

如果是:2019-02-01至2019-02-05(同为一个月)   

则为:2019-02-01,2019-02-02,2019-02-03,2019-02-04,2019-02-05   

如果是:2019-02-26至2019-03-02(不同的月,有31号的月份)   

则为:2019-02-26,2019-02-27,2019-02-28,2019-03-01,2019-03-02

coding:

/**
 * @param  string $start_date 开始日期
 * @param  string $end_date   结束日期
 * @return array              返回两个日期之间的间隔日期数组
 */
function get_diff_date($start_date,$end_date)
{
    $result = array();

    $dt_start = strtotime($start_date);
    $dt_end   = strtotime($end_date);

    while ($dt_start <= $dt_end)
    {
        $result[] = date('Y-m-d', $dt_start);

        $dt_start = strtotime('+1 day', $dt_start);
    }

    return $result;
}

$res = get_diff_date('2009-02-26','2009-03-03');

var_dump($res);exit;

可参考:https://www.cnblogs.com/kccdzz/p/6685181.html


十、删除指定目录的文件夹以及文件夹下的所有文件

/**
 * 递归删除指定目录的文件夹以及文件夹下所有文件
 * @author wzyl
 * @date   2017-09-03 13:00
 * @param  string  $dir 删除路径
 * @return boolean      成功返回true  失败返回false
 */
function remove_dir($dir)
{
    if(is_dir($dir))
    {
        $o = opendir($dir); //是路径所以才打开

        //循环遍历文件
        while($file = readdir($o))
        {
            if($file != "." && $file != "..")
            {
                //判断当前文件是目录还是文件(必须是完整路径),如果当前目录是文件,则直接删除文件
                if(!is_dir($dir.'/'.$file))
                {
                    unlink($dir.'/'.$file);
                }
                else
                {
                    //当前目录不是文件 而是一个目录 则递归进行处理
                    remove_dir($dir.'/'.$file);
                }
            }
        }

        closedir($o);

        //删除文件夹
        @rmdir($dir);
    }

    return true;
}

//调用示例
var_dump('D:\runtime');  //runtime目录及目录下的所有文件和文件夹都会被删除


十一、将数组中指定的key按照指定字符截取,并将截取后的结果追加一个新的key保存

/**
 * 将数组中指定的key按照指定字符截取,并将截取后的结果追加一个新的key保存
 * @params array  $arr       二维数组
 * @params string $sub_key   截取数组中的哪个key
 * @params string $character 指定key中的字符截取
 * @return array
 */
function sub_arr_append($arr, $sub_key, $character = '_')
{
    if(empty($arr)) return array();

    foreach($arr as $key => $val)
    {
        $arr[$key]['new_key'] = substr($val[$sub_key], strpos($val[$sub_key], $character) + 1);
    }

    return $arr;
}

//调用示例
$arr = array(
    0 => array('id' => 61, 'chat_id' => 10, 'to_id' => 'md_1159', 'content' => '123'),
    1 => array('id' => 61, 'chat_id' => 10, 'to_id' => 'md_52', 'content' => '789')
);

var_dump(sub_arr_append($arr, 'to_id'));

//输出结果如下:
array (size=2)
  0 => 
    array (size=5)
      'id' => int 61
      'chat_id' => int 10
      'to_id' => string 'md_1159' (length=7)
      'content' => string '123' (length=3)
      'new_key' => string '1159' (length=4)
  1 => 
    array (size=5)
      'id' => int 61
      'chat_id' => int 10
      'to_id' => string 'md_52' (length=5)
      'content' => string '789' (length=3)
      'new_key' => string '52' (length=2)




声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与