过滤json中下划线字段名为驼峰式

作者:matrix 发布时间:2018-03-31 分类:零零星星

项目中有需要将统一的json接口数据转换为驼峰式字段名,但是网上的确没找到能解决的代码。
还好难度不大,直接正则替换就好。代码都是去年写的了,一直放在有道云笔记里面,早就想拉出来分享下,趁着还是3月份 补一片文章来占位。
代码是php的,其他语言同理用正则替换解决。

 /**
     * json编码处理 传入数组
     * json字段名统一输出为驼峰式
     * @param $data
     * @return array
     */
    protected function json_encode($data)
    {
        $data =  json_encode($data);
        return preg_replace_callback('/[_]([a-zA-Z])(?=[^"]*?":)/',
            function ($matches) {
                return strtoupper($matches[1]) ;
            }, $data);
    }

说明:
代码不需要过多解释,传入数组数据 结果值会返回json字符,字段名推统一替换为驼峰式。
核心在于[_]([a-zA-Z])(?=[^"]*?":)的正则表达式
PEACE~

ThinkPHP 3.2 添加软删除功能

作者:matrix 发布时间:2016-12-31 分类:零零星星

类似于TP5框架的软删除功能

软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复。

这里以数据库表Dynamics为例

执行SQL语句给表新建字段delete_time:
ALTER TABLE sx_dynamics ADD `delete_time` char(13) DEFAULT NULL COMMENT '删除时间';

新建Model层文件

<?php 
/**
 * Created by PhpStorm.
 * User: pang
 */
namespace Home\Model;

use Think\Model;
use Think\Page;

class DynamicsModel extends Model
{
    /**
     * 重写Model删除方法 实现TP5类似的软删除
     *
     * @param bool $trueDel 是否真实删除数据
     * @return mixed
     */
    public function delete($trueDel = false)
    {
        if ($trueDel) {
            return parent::delete();
        }
        $data['delete_time'] = time();
        return parent::save($data);
    }
}

在Controller层

//使用D()方法实例化Model 调用重写的delete 软删除方法
D('dynamics')->where($w)->delete();

查询的where条件:

$where['delete_time'] = array('exp', 'IS NULL');//没有删除的数据
$where['delete_time'] = array('exp', 'IS NOT NULL');//已经删除的数据

-EOF-
for mac

suning云盘解析源码[PHP]

作者:matrix 发布时间:2015-10-29 分类:PHP

苏宁云盘的下载速度还是不错的,之前获取下载地址很简单。现在必须要求用户登录才能办到,难度也是增加不少。还好suning没做绝。GOOD LUCK!

提示: 回复可见网盘地址

源码

阅读剩余部分 »

PHP递归函数内的静态变量

作者:matrix 发布时间:2015-06-20 分类:兼容并蓄 零零星星

//静态变量的例子

/**
 * 将数组转换为字符
 *
 * 用于缓存
 *
 * @param $data
 * @return string
 */
function philnaArray2String($data, $returns = '')
{
    static $t = 1;
    $tabType = " ";
    $tab = str_repeat($tabType, $t);
    $data = (array)$data;
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            $t++;
            $returns .= "$tab'" . $key . "' => array(\n" . philnaArray2String($value) . "$tab),\n";
        } else {
            if (!is_bool($value)) {
                $value = "'" . addslashes($value) . "'";
            }
            $returns .= "$tab'" . $key . "' => $value,\n";
        }
    }
    $returns = substr_replace($returns, '', -2, -1);
    return $returns;
}

说明:
上面php代码中的$t被static修饰,即为静态变量
静态变量在函数执行完毕后不会释放,会继续累加下去
赶脚非常合适在递归函数中用

参考:http://blog.csdn.net/shaerdong/article/details/8545874

win和linux的php异或运算结果不同

作者:matrix 发布时间:2015-06-17 分类:兼容并蓄 零零星星

一个获取key的函数(模拟js的php代码)在本地测试成功,而在服务器上失败。
逐行die()之后发现问题在于$b ^=4294967295;之前获取的$b都没问题,可到了这里就结果完全不一样。

win

<?php
$a = -38622 72608;
$b = 471468;
$c = $a ^ $b;
echo $c;
//Q1:
//本地这是5.2.14的php,Win,显示432886796;
//服务器上5.2.14的php,linux,显示-3862080500;
//Q2:如果将^ 换成xor
//本地显示-3862272608
//服务器显示-3862272608
?>

真是狗日的xor仙人板板。为什么换成xor结果和^又不同。
难道xor不是异或。。。 😕

Q1:幸好我不是第一个发现。算是有答案:
php中一个整数能表示的范围是2147483647~-2147483647
在linux环境下,php整数溢出的时候,其结果是不可靠
php提供了GMP库进行精确计算大数据
如果你的php开启了GMP:gmp_xor()进行xor运算

Q2:无解
将^ 换成xor运算win和linux的结果都一样。但是为毛线它又和^的结果不同。。。
应该也是整数溢出吧。。。懒得想了

参考:
php异或运算的不可靠性
http://php.net/manual/zh/ref.gmp.php
http://bbs.csdn.net/topics/390566090

将BCS的bucket文件保存到本地[PHP]

作者:matrix 发布时间:2015-06-03 分类:兼容并蓄 零零星星

收到百度BCS 6月30日停服提醒邮件,说是要停止服务,请自重。让咱BCS迁移到BOS...

BCS的bucket是以前创建bae时设置的,保存了一些图片文件

怎样把云存储的文件备份到本地是一个问题啊。毕竟一个一个下载太麻烦,文件有些多。。。

BCS控制台:http://developer.baidu.com/console#app/project

打开BCS控制台可以查看你的bucket名称以及API Key 和Secret Key。如果里面的文件有点多,且你想保存下来

下载 :http://pan.baidu.com/s/1mgMhp92

使用说明:

请确保解压后有个空的TTSEE文件夹,它用来存放下载的文件

只能保存一个bucket里面的文件,bucket有多层文件夹应该(我没试过)能正常使用的。

//$bcsobj->list_object_by_dir($bucket,'/',$list_model = 2);

解压后配置好bcs/conf-inc.php参数:项目对应的AK 公钥和SK私钥(百度开发者中心里复制)

调用:127.0.0.1/download.php?bucket=bucket名称

php中用到了file_put_contents函数:

$file = file_get_contents('http://bcs.duapp.com/newbuck'.$objest);//读取远程文件
file_put_contents('TTSEE'.$objest,$file);//保存到同级TTSEE目录

参考:

http://www.cnblogs.com/m199/p/3450675.html

http://www.jb51.net/article/57127.htm

PS:
150710后续更新
把bcs文件下载到本地电脑后再上传到主机空间。
之后用sql语法批量替换旧url。

UPDATE wp_posts 
SET post_content = ( Replace (post_content, 'bcs.duapp.com/newbuck/', 'www.hhtjim.com/wp-content/uploads/2015/bcsfile/') )
WHERE Instr(post_content, 'jpeg') > 0 
 OR Instr(post_content, 'jpg') > 0 
 OR Instr(post_content, 'gif') > 0 
 OR Instr(post_content, 'png') > 0

参考:

在 WordPress 設定 HTTPS,強制使用 SSL 安全加密協定教學

y.qq.com-php获取QQ音乐外链源码

作者:matrix 发布时间:2015-05-18 分类:零零星星

QQ音乐
MP3接口

http://tsmusic24.tc.qq.com/{音乐ID}.mp3
http:/ /stream.qqmusic.tc.qq.com/{音乐ID}.mp3
http:/ /stream{1-30都可以}.qqmusic.qq.com/{音乐ID}.mp3
http://tsmusic128.tc.qq.com/{音乐ID+30000000}.mp3 (请计算出结果)
QQ音乐高品质ogg
http://tsmusic128.tc.qq.com/{音乐ID+40000000}.ogg (请计算出结果)

M4A接口

http://tsmusic24.tc.qq.com/{音乐ID}.m4a
http://thirdparty.gtimg.com/{音乐ID}.m4a?fromtag=38
http://thirdparty.gtimg.com/C100{音乐MID}.m4a?fromtag=38
http://cc.stream.qqmusic.qq.com/C200{音乐MID}.m4a?vkey={VKEY的值}&guid=1830679348

过程

示例获取单曲页面的MP3或M4A文件链接
http://y.QQ.com/#type=song&mid=002G0sJY2wThyx
其中的002G0sJY2wThyx就是歌曲的mid
打开上面的URl浏览器会加载iframe框架http://s.plcloud.music.QQ.com/fcgi-bin/fcg_yqq_song_detail_info.fcg?songmid=002G0sJY2wThyx
Ctrl +U查看源码

var g_SongData = { id: 7168586, songmid: '002G0sJY2wThyx', songname: '喜欢你', singer:'G.E.M. 邓紫棋', singerid:13948,singermid:'001fNHEf1SFEFN',albumname:'喜欢你', albumid:654246,albummid:'000cFPKx3ZGzks', status:31, fnote:0};/*status:非0(true)表示正常歌曲,0(false)表示下架歌曲或者歌曲不存在*/

说明:其中的7168586就是对应歌曲的id,而002G0sJY2wThyx是歌曲的mid,每首歌曲的信息都不同,这需要使用正则匹配数据

php代码:

<?php
$u = $_GET['u'];
$type = $_GET['t']?$_GET['t']:'mp3';
$con = 'http://s.plcloud.music.qq.com/fcgi-bin/fcg_yqq_song_detail_info.fcg?songmid='.$u;
preg_match('|var g_SongData = ({.*});|',file_get_contents($con),$data);
$obj = json_decode(format_ErrorJson(iconv('GBK', 'UTF-8', $data[1])));
$id = $obj->id;
//$mid = $obj->songmid;
$url = 'http://tsmusic24.tc.qq.com/'.$id.'.'.$type;
header('Location: '.$url);
function format_ErrorJson($data)
{
    $con = str_replace('\'','"',$data);//替换单引号为双引号
    $con = preg_replace('/(\w+):[ {]?((?<YinHao>"?).*?\k<YinHao>[,}]?)/is', '"$1": $2',$con );//若键名没有双引号则添加
    return $con;
}

说明:
上面代码只是用了MP3和M4A的第一种接口
代码保存为php文件,调用/xxx.php?u=音乐ID&t=格式
例如001yJypt4E8GW0歌曲的m4a地址
/xxx.php?u=001yJypt4E8GW0&t=m4a
阅读剩余部分 »

php函数用数组传递多位参数

作者:matrix 发布时间:2015-05-17 分类:兼容并蓄

我之前不会编写函数,都是用的别人做的。后来慢慢学会就逐步添加想要的功能,但是问题出现了。
我修改的函数(用于curl抓取页面)的相关设置太多,导致函数的形参多的冒泡,使用起来很麻烦

function curl_get($url, $re=0,$ua=0,$ip=1,$post=0,$followLocation=0......){}//像这样
curl_get($url, 0,0,0,$post,0,1,0......)//每次调用的时候很蛋疼

最近难以忍受调用这种形式的函数,遂修改下

function curl_get($url, $array=array('re'=>0,'ua'=>0,'ip'=>1,'post'=>0,followLocation=>0,......)){}

刚开始没发现使用上有问题,但是后来真闯到鬼了,明明默认的形参是ip=1,但是打死都没反应
curl_get($url, $array=array('post'=>0))后来知道是怎么回事:调用函数时的array('post'=>0)参数覆盖了形参$array=array('re'=>0,'ua'=>0,'ip'=>1...),等于是这样的话除了设置的post数组,其他的数组都没有设置(包括形参)。。。好吧,看下面解决办法

解决方案1

function curl_get($url, $array=array())
{
$defaultOptions = array(
're'=>0,
'ua'=>0,
'ip'=>1,
'post'=>0,
'followLocation'=>0,
//......
);
$array = array_merge($defaultOptions, $array);
//do......
}

解决方案2

function curl_get($url,$str='') {
$str_deaful='re=0&ua=0&ip=1&post=0&followLocation=0...';
parse_str($str_deaful,$arr);
parse_str($str,$arr2);
$array = array_merge($arr,$arr2);
//do......
}

参考:http://segmentfault.com/q/1010000000192291