ThinkPHP3.2.3 递归无限分类

因为递归的效率相对来说比较低,所以很少使用,尤其是在查询数据库的时候对数据库的长时间占用很不合理。

但是递归遍历无限分类列表还是相当重要的,而且还可以对数据进行格式化处理,如果嫌弃效率问题,本人给你一个好建议就是缓存。比如当用户登录的时候判断完用户的权限后获取用户可以操作的菜单,然后递归格式化菜单分类列表,然后缓存起来,这样用户之后的操作都不会涉及到递归获取菜单,效率可以大大提升。

以下是在ThinkPHP3.2.3中使用递归遍历菜单的方法:
1.在项目的Common目录中的function.php中添加以下函数:

/**
 *
 * @param array $data 结果集
 * @param int $fid 父类ID
 * @param array $result 结果数据
 * @param int $deep 分类级数
 * @return array
 */
function getList($data, $fid = 0, &$result = array(), $deep = 0)
{
    $deep += 1;
    foreach($data as $key => $val)
    {
        if($fid == $val['fid'])
        {
            $result[$key]['id'] = $val['id'];
            $result[$key]['name'] = "|".str_repeat("--", $deep).$val['name'];
            $result[$key]['fid'] = $val['fid'];
            $this->getList($data, $val['id'], $result, $deep);
        }
    }
    return $result;
}


Nginx配置if巧妙多条件

在Nginx的网站配置文件里面可以使用if(){}来添加判断,但是一开始我理解成了和PHP一样的语法,所以我写了如下规则:

if ( $ssl_protocol = "" && $host = keinx.com ) { return 301 https://$host$request_uri; }

但是当我重启Nginx的时候提示配置文件错误,错误的位置在"&&",后来在网上查询得到原来Nginx的配置只支持一次判断和PHP中的不一样,于是我就写了下面这种规则,就可以满足多重判断了。

set $flg a;
if ( $ssl_protocol = "" ) { set $flg "${flg}b"; }
if ( $host = keinx.com ) { set $flg "${flg}c"; }
if ( $flg = "abc" ) { return 301 https://$host$request_uri; }

然后重新启动Nginx发现没有问题了,在测试一下缺失OK,如果你遇到这样的问题,可以使用这种方法加多重判断,如果你有更好的方法请留言告诉我,谢谢!

五支牙膏,我在北京的长度

叙:
将这篇文章写在离开北京前,献给我一年的青春,献给在这里认识的所有人,献给还在北京为梦想奋斗的人,献给四季的光阴。从15年9月6日到北京算起已有一年多的时间,我仔细回忆了下,这段时间里我一共用过了五支牙膏。这或许就是天注定我在北京的长度。

一.野心驱使来北京

来北京前我在郑州从事过机房管理、无盘网络技术维护、打印机维修、上门电脑维修等和计算机沾点边的工作,但都因为不合口味每一次都干不了多久便离职了,也被别人看作是不踏实的表现(包括我女朋友),后来在一部书里面看到这其实是很多年轻人的通病,属于职业选择期的正常表现(或许是自己给自己的安慰吧)。每一次换工作都计划的很好,如何如何干,从什么起步干到什么程度,基本上就是一个每三个月的人生计划。但是后来都放弃了。至于为什么放弃,无非太苦太累、没前途、没意思。唯一能让我保持劲头的是路一直都是自己选择的。

时间很快,熬过了“各式各样”的工作,熬过了考驾照,到最后没有什么可以拿出来熬的时候自己心慌了,又像之前那样开始计划着又一次的选路, 不踏实的本质又开始了。其实当时选择了很多,有一些我自己都不好意思说出来,就是那种孩子般的天方夜谭,后来选择了学PHP,成为一名程序员,其实这个职业很早就有考虑过,但是被英语吓得不敢入门罢了。

野心是有的,开公司融资上市,哪个创业者没有做过这样的梦,但是说给别人听可以,自己还是装的沉稳一点吧。同样是抱着这种野心我选择了来北京,自然先是学PHP这门最简单的手艺了。“学习是最幸福的”这句话我现在深有体会。而且编程是可以很轻松让你获得成就感的事情,如果我将来的孩子是个男孩,我会从小教他敲代码。

孤身一人背个书包,拉个行李箱,里面还塞满了之前买来的编程书籍,这就是我来北京时的样子,不管生活条件多差,未来的幸福就在自己指尖下的键盘上。


PHP自带排序函数和四种排序算法

废话

PHP的自带函数真是太强大了,不只是什么都有,还都是拿C写的效率绝对可以。可能这就是函数式编程的优势吧,我目前的水平也就在函数式编程这个层面了,面向对象刚刚入门!勿喷,喷请轻喷。PHP是世界上最好的语言,没有之一!

不废话,说说我的遭遇吧,本人算法水平很菜,需要实现一个无序数组的有序排列。于是写了半天的排序算法总算是写好了(冒泡)。为了看看人家的排序算法的写法就去百度了一下,搜到了PHP最常见的四种排序算法(冒泡、选择、插入、快速),然后莫名其妙的又搜到了一个PHP自带的排序函数,于是我就对这五种方法进行了测试,对执行效率进行排序。

发现PHP自带的函数执行速度都快要超过用PHP写的代码速度的一倍了,真是太厉害,我都不知道我应该崇拜PHP还是崇拜C语言了,但是这两种我都是会学的,PHP是我的第一门语言,先学好他,最终还是要学C的,用C写出一大堆PHP扩展来用,想一想这画面太美好。不过说回来,将来还是要面向对象的。

//执行速度
sort() < 快速 < 插入 < 选择 < 冒泡

看来我自己写的冒泡算法是最慢的,PHP自带的函数效率是最快的。

代码

下面是四种算法,在PHP自带函数的面前,感觉没啥用了...

利用CURL发送图片 做一个图片存储API

需求

工作的重要性除了吃饱饭,还有一个好处,就是在实际的场景下寻求解决问题的方法。不是那种模拟题预设好答案。

这次遇到这样一个新问题,要专门做一台服务器用来存储图片文件,而且这台服务器有PHP环境,希望这台服务器提供一个图片存储API接口,我们只需要在其他地方将图片发送到这个API接口,就可以将这张图片存储到这台服务器,而去API接口可以返回存储的路径和文件名。然后就是开始求代码了!

分析

碰到上面的问题,我一开始的想法就是图片上传POST到这台图片存储服务器上的API不就好了,但是又遇到一个问题,那就是上传图片的同时如果需要发送其他数据,多个POST地址是不利于后期维护的,而去不符合图片服务器API设计初衷。

于是那个神奇的CURL又一次出现在脑海里,对可以使用CURL来作为中间转发图片数据,然后用API接口接收。就这样,动手实现这个功能。

解决

我这里先在项目中的公共函数库里面添加了CURL模拟POST上传图片的函数如下: