标签 php 下的文章

文章转自:PHP笔记 - E度笔记

/**
 * 十进制数转换成62进制
 *
 * @param integer $num
 * @return string
 */
function to62($num) {
    $to = 62;
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $ret = '';
    do {
        $ret = $dict[bcmod($num, $to)] . $ret;
        $num = bcdiv($num, $to);
    } while ($num > 0);
    return $ret;
}
/**
 * 62进制数转换成十进制数
 *
 * @param string $num
 * @return string
 */
function from62($num) {
    $from = 62;
    $num = strval($num);
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $len = strlen($num);
    $dec = 0;
    for($i = 0; $i < $len; $i++) {
        $pos = strpos($dict, $num[$i]);
        $dec = bcadd(bcmul(bcpow($from, $len - $i - 1), $pos), $dec);
    }
    return $dec;
}
/**
 * 十进制数转换成其它进制
 * 可以转换成2-62任何进制
 *
 * @param integer $num
 * @param integer $to
 * @return string
 */
function dec_to($num, $to = 62) {
    if ($to == 10 || $to > 62 || $to < 2) {
        return $num;
    }
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $ret = '';
    do {
        $ret = $dict[bcmod($num, $to)] . $ret;
        $num = bcdiv($num, $to);
    } while ($num > 0);
    return $ret;
}
/**
 * 其它进制数转换成十进制数
 * 适用2-62的任何进制
 *
 * @param string $num
 * @param integer $from
 * @return number
 */
function dec_from($num, $from = 62) {
    if ($from == 10 || $from > 62 || $from < 2) {
        return $num;
    }
    $num = strval($num);
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $len = strlen($num);
    $dec = 0;
    for($i = 0; $i < $len; $i++) {
        $pos = strpos($dict, $num[$i]);
        if ($pos >= $from) {
            continue; // 如果出现非法字符,会忽略掉。比如16进制中出现w、x、y、z等
        }
        $dec = bcadd(bcmul(bcpow($from, $len - $i - 1), $pos), $dec);
    }
    return $dec;
}
/**
 * 当然,利用上面两个函数,可以进行任何进制之间相互转换:
 * 数字的任意进制转换
 *
 * @param integer|string $number
 * @param integer $to 目标进制数
 * @param integer $from 源进制数
 * @return string
 */
function radix($number, $to = 62, $from = 10) {
    // 先转换成10进制
    $number = dec_from($number, $from);
    // 再转换成目标进制
    $number = dec_to($number, $to);
    return $number;
}

知道什么是蛇形命名法(snake case)和驼峰命名法(camel case)吗?
snake case类似于这样: file_name、 line_number、 my_first_program
camel case类似于这样: fileName、 lineNumber、 myFirstProgram

使用PHP内置函数实现

// 蛇形命名转换为驼峰命名
function SnakeToLowerCamel($value){
    $value = ucwords(str_replace(['_', '-'], ' ', $value));
    $value = str_replace(' ', '', $value);
    return lcfirst($value);
}

// 驼峰命名转换为蛇形命名
function CamelToSnake($value){
    // 以 UTF-8 模式删除空字符
    $value = preg_replace('/\s+/u', '', $value);
    // “?=”为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串
    // 这里的正则表达式匹配所有大写字符的前一个字符
    $value = strtolower(preg_replace('/(.)(?=[A-Z])/u', "$1_", $value));
    return $value;
}

// 附加一个:蛇形命名转换为大驼峰命名(首字母大写 如: FileName、 LineNumber、 MyFirstProgram)
function SnakeToUpperCamel($value){
    $value = ucwords(str_replace(['_', '-'], ' ', $value));
    $value = str_replace(' ', '', $value);
    return $value;
}

// 主要是我目前没常用但又比较实用的,记录方便之后用到查询~

// 查询某个字段的值 (value 方法查询结果不存在,返回 null)
$user_name = Db::name('users')->where('id','1')->value('name');

// 查询某一列的值可以用 (column 方法查询结果不存在,返回空数组)
// 该查询跟field链式操作方法区别是该方法查询结果中二维数据的键是查询数据中的主键
// field链式操作方法结果的二维数据主键是从0自增
$users = Db::name('users')->where('sex','1')->column('id,name,sex');

// 数据集分批处理
// 该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包
// 此方法在处理大量数据库的时候非常实用
Db::name('users')->chunk(100, function($users) {
    foreach ($users as $user) {
        // 处理每次取出的结果集
        p($user['id']);
    }
    p("--------------------");
});

原文地址 : http://www.nowamagic.net/librarys/veda/detail/2407

以下文字并没有非常多的技术词汇,所以只要对PHP感兴趣的人都可以看看。

PHPer是草根吗?
从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务。同时,作为针对Web开发量身定制的脚本语言,PHP一直秉承简单、开源的思想,这也使得PHP得以快速的发展,并且大力地推动Web2.0的出现与发展。但是,长期以来,PHPer(PHP Programmers)被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤其突出。


- 阅读全部 -

背景

因当前开发功能需要用微信绑定第三方网站的用户表,然而微信订阅号没有 网页授权获取用户基本信息 的权限,于是就想到利用微信自动回复功能实现,点击自动回复的超链接跳转到第三方网站,这种方式有可能不当或者有其他更好的方式实现此功能,欢迎留言或者加QQ指出,具体实现如下:

步骤

// 在这里就不提微信接入及其他问题,只记录如何利用自动回复打开笫三方网站获取用户信息
// 因为在用户关注或者在给公众号文字消息的时候可以获取到用户的openid
// 于是就可以利用自动回复的功能
define("TOKEN", "token");
$echoStr = $_GET["echostr"];
//如果有$echoStr说明是对接
if (!empty($echoStr)) {
    //对接规则
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    if( $tmpStr == $signature ){
        echo $echoStr;
    }else{
        echo "";
        exit;
    }
}else{
    responseMsg();
}

//用于回复用户消息
function responseMsg(){
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    if (!empty($postStr)){
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
        $MsgT = $postObj->MsgType;
        $time = time();
        //如果用户发的text类型
        if($MsgT=="text"){
            $key = trim($postObj->Content);
            $fromUsername = $postObj->FromUserName;
            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        </xml>"; 
            $msgType = "text";
            $answer = "<a href='http://www.baidu.com?openid=%s'>点击跳转</a>";
            // 如果有占位符就替换成openid
            $contentStr = strpos($answer, '%s') ? sprintf($answer,$fromUsername) : $answer;
            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            echo $resultStr;
            exit;
        }

        //如果用户发的event(事件)类型
        if($MsgT=="event"){
            $Event = $postObj->Event;
            if ($Event==subscribe) {
               $contentStr = "欢迎关注";
            }else{
                $contentStr = "希望您下次关注,但您收不到此条消息了";
            }

            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        </xml>"; 
            $Title = $postObj->Title;
            $Description = $postObj->Description;
            $Url = $postObj->Url;
            $msgType = 'text';
            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            echo $resultStr;
            exit;
        }
    }else{
        echo "";
        exit;
    }
}

结果

点击自动回复超链接就可以把openid带到第三方网站,然后就可以利用openid查到用户的信息

PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如几个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。
使用生成器读取文件,可以第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,可以大大的减小了内存的使用。

header("content-type:text/html;charset=utf-8");
function getLines($file) {
    $f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

foreach (getLines("sgland.log") as $n => $line) {
    //逐行内容
    echo $line . "</br>";
    //行数
    // var_dump($n);
}

microtime();  //返回当前 Unix 时间戳的微秒数:
$start = microtime(true);
$data = range(0, 1000000, 1);
foreach ($data as $val){
    echo $val;
}
$end = microtime(true);
echo  '耗时' . round($end - $start, 3) . '秒' . "\n";

memory_get_usage();  //返回当前分配给PHP脚本的内存量,单位是字节(byte)
echo '开始内存:'.memory_get_usage(), ''; 
$tmp = str_repeat('hello', 1000);   
echo '运行后内存:'.memory_get_usage(), '';  
unset($tmp);   
echo '回到正常内存:'.memory_get_usage(); 

<?php
    function geturl($url){
            $headerArray =array("Content-type:application/json;","Accept:application/json");
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray);
            $output = curl_exec($ch);
            curl_close($ch);
            $output = json_decode($output,true);
            return $output;
    }
    function posturl($url,$data){
            $data  = json_encode($data);    
            $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return json_decode($output,true);
    }
    function puturl($url,$data){
        $data = json_encode($data);
        $ch = curl_init(); //初始化CURL句柄 
        curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output,true);
    }
    function delurl($url,$data){
        $data  = json_encode($data);
        $ch = curl_init();
        curl_setopt ($ch,CURLOPT_URL,$put_url);
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");   
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output,true);
    }
    function patchurl($url,$data){
        $data  = json_encode($data);
        $ch = curl_init();
        curl_setopt ($ch,CURLOPT_URL,$url);
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");  
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);     //20170611修改接口,用/id的方式传递,直接写在url中了
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output);
        return $output;
    }
?>

<?php 
    static public function unlimitedForLevel($cate,$html='|—',$pid=0,$level=0){
        //建立空数组存储结果
        $arr = array();
        //循环$cate,如果这级的pid等于上一级的cid,就先压入数组,再找当前的下一级
        foreach ($cate as $v) {
            //查找当前分类是否有子分类
            if ($v['parent_id'] == $pid) {
                $v['level'] = $level + 1;
                $v['html'] = str_repeat($html, $level);

                $arr[] = $v;
                //递归合并数组
                $arr = array_merge($arr,self::unlimitedForLevel($cate,$html,$v['id'],$level+1));
            }
        }
        return $arr;
    }

    //静态方法获取多维数组递归结果
    static public function unlimitedForMore($cate,$name='child',$pid=0){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['parent_id'] == $pid) {
                $v[$name] = self::unlimitedForMore($cate,$name,$v['id']);
                $arr[] = $v;
            }
        }
        return $arr;
    }

    //递归获取父函数
    static public function getParents($cate,$cid){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['id'] == $cid) {
                $arr[] = $v;
                $arr = array_merge(self::getParents($cate,$v['parent_id']),$arr);
            }
        }
        return $arr;
    }

 ?>