PHP常用代码片段

整理一份代码片段列表,涵盖了大部分经常用到的函数,都是近期在实际工作中用到的,做个记录。

获取url参数

    function getParams()
    {
        $url = '/index.php?_p=index&_a=show&x=12&y=23';

        $refer_url = parse_url($url);

        $params = $refer_url['query'];

        $arr = array();
        if (!empty($params)) {
            $paramsArr = explode('&', $params);

            foreach ($paramsArr as $k => $v) {
                $a          = explode('=', $v);
                $arr[$a[0]] = $a[1];
            }
        }
        return $arr;
    }

curl这么玩

function curl($param){
    $ch = curl_init();
    $opt = array(
        CURLOPT_URL             =>  $param['url'],
        CURLOPT_RETURNTRANSFER  =>  true,
        CURLOPT_CONNECTTIMEOUT  =>  60,
        CURLOPT_USERAGENT       =>  'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4',
    );
    if (isset($param['post']) && $param['post']) {
        $opt[CURLOPT_POST]             = true;
        $opt[CURLOPT_POSTFIELDS]	= $param['fields'];
    }
    if (isset($param['host']) && $param['host']) {
        $header[] = $param['host'];
        $opt[CURLOPT_HTTPHEADER] = $header;
    }
    curl_setopt_array($ch, $opt);
    $rst = curl_exec($ch);
    curl_close($ch);
    return $rst;
}

// 调用
$param['url'] = 'http://xxx.com';
$opt = array(
    'name'  =>  '王小明',
    );
$param['post'] = 1;
$param['fields'] = array(
    'data'  =>  json_encode($opt),
    'type'  =>  'ZBCXHF',
    );
$rsts = json_decode(curl($param), 1);
echo "<pre>";
print_r($rsts);
echo "<img src='{$rsts['url']}'>";

多维数组遍历修改

function myForeach(&$arr){
    if (!is_array($arr)) return false;
    foreach ($arr as $k => &$v) {
        if (is_array($v)){
            myForeach($v); 
        }else{
            $v .= 'ooo';
        }
    }
    return $arr;
}

$arr = array(
    'a' =>  array('one'=>1,'two'=>2,'three'=>array('i'=>'love')),
    'b' =>  array('one'=>1,'two'=>2,'three'=>3),
    'c' =>  array('one'=>1,'two'=>2,'three'=>3),
    'd' =>  array('one'=>1,'two'=>2,'three'=>3),
    array('a','b','c'),
    'aa',
);
$arr1 = $arr;

$rsts = myForeach($arr);
$rsts1 = myForeach($arr);
echo "<pre>";
print_r($rsts);
print_r($rsts1);
print_r($arr1);

注意:采用此方法会修改引用数组的原值,如果需要保留原数组的值,要在遍历前先用新变量保存。

设置时区

date_default_timezone_set(‘RPC’);

打印函数

function p($param){
    echo "<pre>";
    print_r($param);
    echo "<\/pre>";
}

文件转换编码

function file_to_utf8($filename) {
    if (file_exists($filename)) {
        $data = file_get_contents($filename);
        if (!empty($data)) {
            $fileType = mb_detect_encoding($data, array('UTF-8', 'GBK', 'LATIN1', 'BIG5'));
            if ($fileType != 'UTF-8') {
                $data = mb_convert_encoding($data, 'UTF-8', $fileType);
            }
        }
        return file_put_contents($filename, $data);
    }else{
        return false;
    }
}

二维数组根据某个键值去重(截取前n条)

function my_array_uniqe($arr, $key, $num = 10){
        $temp_arr = array();
        if (is_array($arr)) {
            foreach ($arr as $k => $v) {
                if (in_array($v[$key], $temp_arr)) {
                    unset($arr[$k]);
                }else{
                    $temp_arr[] = $v[$key];
                }
            }
            // 截取前$num条,默认10条
            if (count($arr) > $num) {
                $arr = array_slice($arr, 0, $num);
            }
            return $arr;   
        }else{
            return array();
        }
    }

数组排序:按字符串长度倒序排列

function i_array_usort($arr){
    // 直接修改$arr的值。$a$b代表两个数组元素。strlen($a)-strlen($b)是正序,反之是倒序。
    // 会删除原有键名
    // create_function的第二个参数必须是> or = or < 0的整数
    usort($arr, create_function('$a, $b', 'return strlen($b)-strlen($a);'));
}

关联数组按指定键值对大小排序

function i_assoc_array_sort_by_value($arr, $key, $order, $is_protect_key = true){
    $temp = array();
    // 取出要排序的键值对一维数组
    foreach ($arr as $k => $v) {
        $temp[$k] = $v[$key];
    }
    // 按指定值排序
    if ($order == 'desc') {
        arsort($temp);
    }else{
        asort($temp);
    }
    // 实现二维数组排序,是否保留键值对关联
    foreach ($temp as $k => $v) {
        if($is_protect_key){
            $rst[$k] = $arr[$k];    
        }else{
            $rst[] = $arr[$k];
        }
    }
    return $rst;
}

// 举例
$arr = array(
    array(
        'name'  =>  'lucy',
        'age'   =>  21
        ),
    array(
        'name'  =>  'lili',
        'age'   =>  18
        ),
    array(
        'name'  =>  'dlm',
        'age'   =>  19
        ),
    );

// 调用方法
$rst = assoc_array_sort_by_field($arr, 'age', 'desc');
print_r($rst);

//输出
Array
(
    [0] => Array
        (
            [name] => lucy
            [age] => 21
        )
    [2] => Array
        (
            [name] => dlm
            [age] => 19
        )
    [1] => Array
        (
            [name] => lili
            [age] => 18
        )
)

计算字符串长度(含中文)

function i_count_str($str){
    return count(preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY));
}

无乱码截取中文字符串的三种方法

$str = '我就是Super Man,你信吗?';
function i_sub_str($str, $start, $length){
    echo implode('', array_slice(preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY), $start, $length));
}
echo sub_str_utf8($str, 1, 11);
echo mb_substr($str, 1, 11, 'utf-8'); //可以写成utf8
echo iconv_substr($str, 1, 11, 'utf-8'); // 不能写成utf8

打印今天,昨天,明天,一周内,一周后,一月内,一月后

function i_get_date($op = 0){
    return date('Y-m-d', strtotime("{$op} day"));
}
echo i_get_date(-1);

交换两个变量的值,不借助第三个变量

$a = 1;
$b = 2;
list($a, $b) = array($b, $a);
echo "\$a=$a,\$b=$b";

数字千分位添加逗号

function i_num_split($num){
    return ltrim(strrev(chunk_split(strrev($num), 3, ',')), ',');
}
$num = 1234567890;
echo i_num_split($num);

取URL扩展名的通用方法

function i_get_ext($url){
    $ext = pathinfo($url)['extension'];
    if (strpos($ext, '?')) {
        return substr($ext, 0, strpos($ext, '?'));
    }else{
        return $ext;
    }
}
$url = 'http://www/baidu.com?a=1';
echo i_get_ext($url);

获取url参数的通用方法

function i_get_param($url, $x){
    $param_str = substr($url, strpos($url, '?') + 1);
    $param_arr = explode('&', $param_str);
    foreach ($param_arr as $v) {
        $param = explode('=', $v);
        if ($x == $param[0]) {
            return $param[1];
        }
    }
    p($param_arr);
}
$url = '1.jpg?w=100&h=120';
p(i_get_param($url, 'h'));

中文字符反转

function i_strrev($str){
    return implode('', array_reverse(preg_split('//u', $str)));
}
$str = '我是Super Man,你信吗?';
echo i_strrev($str);

获取目录数量

function i_get_cate_num($path){
    $dir_num = 0;
    $file_num = 0;
    $obj = opendir($path);
    while ((false !== $filename = readdir($obj))) {
        echo $filename . '<br />';
        if ($filename != '.' && $filename != '..') {
            if (is_dir($path . '/' .$filename)) {
                $dir_num += 1;
            }else{
                $file_num += 1;
            }
        }
    }
    echo '目录:' . $dir_num . '<br />文件:' . $file_num;
}
echo i_get_cate_num('test');

遍历目录文件

function i_list_cate($path){
    $arr = [];
    foreach (glob($path.'/*') as $v) {
        if (is_dir($v)) {
            $arr = array_merge($arr, i_list_cate($v));
        }else{
            $arr[] = $v;
        }
    }
    return $arr;
}
$path = 'test';
p(i_list_cate($path));

计算时间差

$startdate = "2015-05-09 00:00:00";
$enddate = date('Y-m-d H:i:s');
$date = floor((strtotime($enddate) - strtotime($startdate)) / 86400);
$hour=floor((strtotime($enddate) - strtotime($startdate)) % 86400 / 3600);
$minute = floor((strtotime($enddate) - strtotime($startdate)) % 86400 / 60);
$second = floor((strtotime($enddate) - strtotime($startdate)) % 86400 % 60);
echo $date."天";
echo $hour."小时";
echo $minute."分钟";
echo $second."秒";
$cha = strtotime($enddate) - strtotime($startdate);
echo $cha;

redis测试

$rds = new Redis();
$rst = $rds->connect('127.0.0.1');
var_dump($rst);
$rds->set('a', serialize(array('a'=>'a','b'=>'b','c'=>'c')));
$rst = $rds->get('a');
var_dump(unserialize($rst));
foreach (unserialize($rst) as $k => $v) {
    echo $v;
}

文件读取 | 保存

PHP保存日志通常是选择数据库方式存储,但是一些不需要经常索引的日志信息可以选择以文件形式保存在本地。

// file_put_contents($path, $data, FILE_APPEND);
// 如果文件存在就追加,不存在会自动新建文件
// PHP_EOL自动根据操作系统匹配相应换行符
$path = 'src/log/' . date('Ymd') . '.txt';
$log = "'$username', '$sql', " . date('Y-m-d H:i:s') . PHP_EOL; 
file_put_contents($path, $log, FILE_APPEND);

获取客户端IP

function getIp(){
    $ip='未知IP';
    if(!empty($_SERVER['HTTP_CLIENT_IP'])){
        return is_ip($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:$ip;
    }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        return is_ip($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$ip;
    }else{
        return is_ip($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:$ip;
    }
}
function is_ip($str){
    $ip=explode('.',$str);
    for($i=0;$i<count($ip);$i++){  
        if($ip[$i]>255){  
            return false;  
        }  
    }  
    return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$str);  
}

$ip = getIp();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值