• [PHP源码阅读]array_pop和array_shift函数

    上篇文章介绍了PHP添加元素到数组的函数,那么当然有从数组中删除元素。array_pop和array_shift只从数组的头或尾删除一个元素。经过阅读源码,发现这两个函数的实现都是调用了同一个函数–_phpi_pop来实现从数组中删除一个数组元素的功能。因此解读时将这两个函数一并讲了。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    函数语法

    array_pop

    mixed array_pop ( array $&array )
    

    array_pop函数弹出并返回数组的最后一个单元,并将数组长度减一。如果array为空则返回NULL。

    Read more...
  • [PHP源码阅读]array_push和array_unshift函数

    在PHP中,在数组中添加元素也是一种很常用的操作,分别有在数组尾部和头部添加元素,看看PHP内部是如何实现数组插入的操作。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    array_push

    int array_push ( array &$array , mixed $value1 [ , mixed $... ] )
    

    array_push函数将array参数看做一个栈,将传递进来的变量压倒array的尾部。array的长度随着被压进去的变量个数增加。下面的代码有意义的效果:

     $array[] = $var; 
    

    Read more...
  • [PHP源码阅读]empty和isset函数

    近日被问到PHP中empty和isset函数时怎么判断变量的,刚开始我是一脸懵逼的,因为我自己也只是一知半解,为了弄懂其真正的原理,赶紧翻开源码研究研究。经过分析可发现两个函数调用的都是同一个函数,因此本文将对两个函数一起分析。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    函数使用格式

    empty

    bool empty ( mixed $var )
    

    判断变量是否为空。

    Read more...
  • [PHP源码阅读]trim、rtrim、ltrim函数

    trim系列函数是用于去除字符串中首尾的空格或其他字符。ltrim函数只去除掉字符串首部的字符,rtrim函数只去除字符串尾部的字符。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    trim

    string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )
    

    参数说明

    character_mask 默认是” \t\n\r\0\x0B”等空白字符。

    使用..可以指定一段范围的字符。此处要注意,”..”左右两边是一对合法的范围值,如果传递的是非法的值会报错。

    Read more...
  • [PHP源码阅读]explode和implode函数

    explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出。在PHP中经常会用到这两个函数,因此有必要了解一下其原理。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    explode

    array explode ( string $delimiter, string $string, [ , $limit ] )
    

    函数返回由字符串组成的数组,每个元素都是string的一个子串,被字符串$delimiter作为边界点分割出来。

    参数说明

    limit

    如果设置了limit,且为正数,则返回的数组最多包含limit个元素,最后的那个元素将包含string的剩余部分。

    如果limit是负数,则返回除了最后的-$limit个元素外的所有元素。

    Read more...
  • [PHP源码阅读]strpos、strstr和stripos、stristr函数

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    strpos

    mixed strpos ( string $haystack, mixed $needle [, int $offset = 0 ] )
    

    如果offset指定了,查找会从offset的位置开始。offset不能为负数。

    返回needle第一次出现在haystack的位置。如果在haystack中找不到needle,则返回FALSE。

    needle,如果needle不是字符串,它会被转换成整型数值并赋值为该数值的ASCII字符。请看下面例子。

    例子

    $str = "hello";
    $pos = strpos($str, 111);
    // 111的ASCII值是o,因此$pos = 4
    

    Read more...
  • [搜索引擎]搜索引擎索引数据结构和算法

    最近一直在研究sphinx的工作机制,在[搜索引擎]Sphinx的介绍和原理探索简单地介绍了其工作原理之后,还有很多问题没有弄懂,比如底层的数据结构和算法,于是更进一步地从数据结构层面了解其工作原理。在网上搜了很多资料,发现没有很多介绍这方面的文章,后来找到了一本书,《这就是搜索引擎》,拜读了本书的第三章,介绍了主流搜索引擎用的数据结构及其工作原理,sphinx使用的数据结构也是一样的,用的也是倒排索引。

    注:本文不会对sphinx和搜索引擎严格区分开,同一作搜索引擎看待。

    先附图一枚: 搜索引擎索引

    Read more...
  • [井字游戏]做一款回忆童年的游戏

    99% of information we read, we forget anyway. The best way to remember is to “DO”.

    体验地址:http://www.hoohack.me/assets/tictactoe/

    游戏完整的代码在我的 github 上,有兴趣也可以围观一下:TicTacToe,也希望大家可以点个 star。

    缘起

    最近在FreeCodeCamp上面学习前端知识,不知不觉已经学到了319课,现在遇到的一个小project是做一款井字游戏。说起井字游戏,真是满满的童年味道,还记得最疯狂的时候是小时候跟同桌拿着一张草稿纸就能玩一节课,回到家跟弟弟也能继续玩,对于没有太多娱乐节目的童年来说,真是一款玩不厌的小游戏。这款游戏代码比较简单,主要是掌握算法的原理,但是也有一些需要注意的地方,于是想把自己遇到的问题记录下来。

    游戏界面

    进入正题。项目的效果图如下:

    Read more...
  • [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作

    最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了PDO做参数绑定,其中遇到了一个坑。

    方案选择

    笔者已知的做批量更新有以下几种方案:

    1、逐条更新

    这种是最简单的方案,但无疑也是效率最低的方案。

    2、CASE WHEN

    类似如下的语句

    UPDATE tbl_test SET val = CASE id WHEN 1 THEN 2 WHEN 2 THEN 3 END WHERE id IN(1, 2); PDO绑定参数
    

    为了防止SQL注入,使用了PDO扩展绑定参数。上面的数字在一般情况下是变量,那么就需要做参数绑定。刚开始是想着在IN的时候将id组成的字符串作为变量绑定过去,第一次实现的代码如下:

    Read more...
  • [搜索引擎]Sphinx的介绍和原理探索

    What/Sphinx是什么

    定义:Sphinx是一个全文检索引擎。

    特性:

    • 索引和性能优异
    • 易于集成SQL和XML数据源,并可使用SphinxAPI、SphinxQL或者SphinxSE搜索接口
    • 易于通过分布式搜索进行扩展
    • 高速的索引建立(在当代CPU上,峰值性能可达到10 ~ 15MB/秒)
    • 高性能的搜索 (在1.2G文本,100万条文档上进行搜索,支持高达每秒150~250次查询)

    Why/为什么使用Sphinx

    遇到的使用场景

    遇到一个类似这样的需求:用户可以通过文章标题和文章搜索到一片文章的内容,而文章的标题和文章的内容分别保存在不同的库,而且是跨机房的。

    Read more...