[转载] php正则表达式实现@某人

PHP正则表达式实现@某人 if(preg_match_all('#@\w+#u', '@张全蛋 含泪质检@三星Note7 被炸飞,听说@炸机 跟@啤酒 更配哦!', $matches)) { var_export($matches); } //输出 array ( 0 => array ( 0 => '@张全蛋', 1 => '@三星Note7', 2 => '@炸机', 3 => '@啤酒', ), ) 正则表达式 #@\w+#u 中:

是分隔符.

u是修饰符,表示Unicode. \w是元字符,在ASCII下等价于[A-Za-z0-9_],在Unicode下表示字符(包括汉字)和数字和下划线. +是量词,表示1个或多个,等价于{1,}

PHP归并排序

<?php

function sortArr($arr) {
    if (count($arr) < 2) {
        return $arr;
    }
    $mid = count($arr) / 2;
    $arr1 = array_slice($arr, 0, $mid);
    $arr2 = array_slice($arr, $mid, count($arr));
    $arr1 = sortArr($arr1);
    $arr2 = sortArr($arr2);

    return mergeArr($arr1, $arr2);
}

function mergeArr($arr1, $arr2) {

    if (!is_array($arr1)) {
        $arr1[] = $arr1;
    }
    if (!is_array($arr2)) {
        $arr2[] = $arr2;
    }

    $i =0;
    $j = 0;
    $arr1Length = count($arr1);
    $arr2Length = count($arr2);
    $returnArr = [];
    while($i < $arr1Length && $j < $arr2Length) {
        if($arr1[$i] > $arr2[$j]) {
            $returnArr[] = $arr2[$j];
            $j++;
        } else {
            $returnArr[] = $arr1[$i];
            $i++;
        }
    }
    for($tmp = $i; $tmp < $arr1Length; $tmp++) {
        $returnArr[] = $arr1[$tmp];
    }
    for($tmp = $j; $tmp < $arr2Length; $tmp++) {
        $returnArr[] = $arr2[$tmp];
    }
    return $returnArr;
}

$arr = [1,3,2,5,7,9,3,1];

$sortableArr = sortArr($arr);

foreach ($sortableArr as $a) {
    print_r($a . "\n");
}

说实话,算法这东西,挺好玩的,以前还搞过快排,但是忘却了,今天这个归并排序应该很难忘记了,毕竟理解起来要比快排好得多,但是快排回来后面补充

Redis zSets 数据类型不一致踏坑记

redis

今天在公司写代码的时候,遇到了一个大问题,简单说一下场景,有两处使用了一个 zSets,一处是从网页获取数据,放到zSets里面;另一处是从数据库获取数据放到 zSets 里面。在后期做清除数据操作的时候,发现了数据清除的不完全,后来仔细的检查了一下。发现数据重复。

仔细测试了好一会儿之后,才发现了问题坐在,就是当score相同的时候,相同的value会覆盖数据,这里的value相同,并不仅仅是值相同,而且数据类型也应该一致才会覆盖。否则就会产生score相同的两条数据。

这个问题是个大坑,记录下来,以后一定要记得

PHP 自动加载

做编程3年了,几乎每年一个转型 (java -> android(web app) -> php),这个节奏太不舒服了。想深入了解什么的时候,总是无奈的转型。现在自己也算是彻底的稳定下来了。可以安心的研究 php 了。php 也做了一年多了,一直在用框架,也就是最近几个月吧,认识到了自己的不足之处,开始逐步研究一些细节方面的东西。

这个博客使用 laravel 弄的,里面很多的细节都是在以前的 java 的时候接触过,但是以前弄 java 的时候就没有太细致的研究。现在也就顺道一起弥补回来。

今天要写的是自动加载, php 中如果想要加载一个类的话,一般采用 require 或者 include 但是呢,自动引入了命名空间以后,类名加上命名空间超级长,然后每个文件开头一排 require 外加一排 use 这个文件无疑太长,而且如果某一次忘记了引入文件,如果项目过大,那么结果就是两个字爆炸 boom shakalaka。排查起来超级麻烦。

所以,就有了自动加载,以前用自动加载都是使用 __autoload 但是这个方法有一个bug,就是只能使用一次。这样造成的问题就是如果我们有多种状态的引用的话,就会产生很长的代码,这是我们所不想见到的。于是就有了 spl_autoload_register 其实,从文档上来看他就是 autoload 的一种实现,但是区别是,这个方法可以执行多次。但是以我这一段看代码来看,其实也就是使用了一次。但是安全第一,而且为了标准还是使用 spl_autoload_register

上面说了一大堆没用,其实有用的就是一个方法 spl_autoload_register ,具体看文档: [http://php.net/manual/zh/function.autoload.php]。

下面进入正题,开始我们的自动加载吧。我直接上代码了:

<?php

use Test32\Test;

spl_autoload_register(function ($class) {
    $path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
    $path .= '.php';
    if (file_exists($path)) {
        require_once ($path);
    } else {
        throw new Exception('Class not exist!');
    }
}, true);

$test = new Test();

$test->sayHello();

现在来解释一下:这个方法会接受三个参数,第一个是一个回掉函数,后面两个是bool类型的参数。后面两个很少使用,所以我们就着重说一下第一个回掉函数,这个函数有一个参数是一个包含命名空间的类名,也就是我们use的那一个部分的名称,我们在这里是使用层次文件夹的方式,构造的目录和文件结构的。所以,在我们收到名称之后,先转换为路径在加上 .php 的文件名后缀,判断一下文件是否存在。如果存在就 require 进去。如果不存在就抛出一个异常,告知class不存在。这样要简单的自动加载器就完成了。

过一段会写composer的各种加载方式。今天就到这里了。后续还会继续写反射相关的东西。然后我自己的大轮子也会以这个自动加载作为一切的基础。逐步完善轮子

Mysql 批量更新多行笔记

今天在公司写代码的时候使用到了 mysql 的批量更新,但是呢,自己之前对其了解的果然不够多啊。所以,回家以后赶紧查查,做好笔记,让自己有更深的记忆。以及更多的了解。

首先我们构造好了一个测试表,如下图

数据库示意图