一、用函数对数组进行去重的方法

arrau_unique函数的作用

移除数组中重复的值。

每个值第一次 出现的健名,健名保留不变。

第二个参数可以选择排序方式:

SORT_REGULAR - 按照通常方法比较(不修改类型)

SORT_NUMERIC - 按照数字形式比较

SORT_STRING - 按照字符串形式比较

SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。

 

array_flip也可以间接实现去重,为什么是间接呢?

因为array_flip的作用是交换数组中的健和值,如果出现多个值,反转后会将最后一个值作为健保留。

使用两次array_flip,结果会保留 每个值最后一次出现的健名,健名不变。

eg:

<?php 
 
 
 

   $arr =array("a"=>"a1","b"=>'b1',"c"=>"a2","d"=>"a1"); 
 
 
 

   $arr1 = array_flip($arr); 
 
 
 

   print_r($arr1);//先反转一次,去掉重复值,输出Array ( [a1] => d[b1] => b [a2] => c ) 
 
 
 

   $arr2 = array_flip($arr1); 
 
 
 

   print_r($arr2);//再反转回来,得到去重后的数组,输出Array([d] => a1 [b] => b1 [c] => a2) 
 
 
 

   $arr3 = array_unique($arr); 
 
 
 

   print_r($arr3);//利用php的array_unique函数去重,输出Array ( [a]=> a1 [b] => b1 [c] =>a2 ) 
 
 
 

   ?>

可以看出,array_flip和array_unique不同的是,前者保留同一个值最后一次出现的健名,而后者保留的是第一次出现的健名。

 

二、php下的魔术方法总结

魔术方法是php面向对象中特有的特性。他们在特定的情况下被触发,都是以双下滑钱开头,可以把他们理解为钩子,利用魔术方法可以轻松实现动态创建类属性和方法(php面向对象中重载)。

1、__contruct,__destruct

__constuct构建对象的时被调用;

__destruct明确销毁对象或脚本结束时被调用;

2、__get,__set

__get读取不可访问或不存在属性时被调用

__set当给不可访问或不存在属性赋值时被调用

3、__isset,__unset

__isset对不可访问或不存在的属性调用isset()或empty()时被调用

__unset对不可访问或不存在的属性进行unset时被调用

4、__call,__callStatic

__call调用不可访问或不存在的方法时被调用

__callStatic调用不可访问或不存在的静态方法时被调用

5、__sleep,__wakeup

__sleep当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用

__wakeup当使用unserialize时被调用,可用于做些对象的初始化操作

6、__clone

进行对象clone时被调用,用来调整对象的克隆行为

7、__toString

当一个类被转换成字符串时被调用

[ 题外题

php将类转换为json字符串,还不是转换成数组。

$json_string = json_encode($object, JSON_FORCE_OBJECT);

区别:

json_encode($object); //结果:"[{"aa":"bb","cc":"dd"}]" 
 
 
 

   json_encode($object,JSON_FORCE_OBJECT); //结果:"{"aa":"bb","cc":"dd"}" 
 
 
 

   ]

8、__invoke

当以函数方式调用对象时被调用

9、__set_state

当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。

10、__debuginfo

当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本

 

一下是简单的举例,详情见:

$m = new Magic(); //__construct()被调用 
 
 
 

   $m->not_exist_property = test; //__set()被调用 
 
 
 

   echo $m->not_exist_property;//__get()被调用 
 
 
 

   $m->abc(1,2,3); //__call()被调用 
 
 
 

   echo isset($m->not_exist_property); //__isset()被调用,返回bool值 
 
 
 

   unset($m->not_exist_property); //__unset()被调用 
 
 
 

   echo $tmp = serialize($m); //__sleep()被调用 
 
 
 

   unserialize($tmp); //__wakeup()被调用 
 
 
 

   $m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制 
 
 
 

   $m(); //__invoke() 
 
 
 

   eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2); 
 
 
 

   var_dump($m);

最后__destruct()被调用

 

三、Redis常见数据结构使用场景

1、string

常用命令: set,get,decr,incr,mget 等。

String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。

常规key-value缓存应用;

常规计数:微博数,粉丝数等。

2、Hash

常用命令: hget,hset,hgetall 等。

Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 比如我们可以Hash数据结构来存储用户信息,商品信息等等。

举个例子: 最近做的一个电商网站项目的首页就使用了redis的hash数据结构进行缓存,因为一个网站的首页访问量是最大的,所以通常网站的首页可以通过redis缓存来提高性能和

并发量。我用jedis客户端来连接和操作我搭建的redis集群或者单机redis,利用jedis可以很容易的对redis进行相关操作,总的来说从搭一个简单的集群到实现redis作为缓

存的整个步骤不难。

3、list

常用命令: lpush,rpush,lpop,rpop,lrange等

list就是链表,Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,最新消息排行等功能都可以用Redis的list结构来实现。

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。

4、set

常用命令:sadd,spop,smembers,sunion 等

set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。

当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常方便的实现如共同关注、共同喜好、二度好友等功能。

5、Sorted Set(zset)

常用命令: zadd,zrange,zrem,zcard等

和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。

举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用Redis中的SortedSet结构进行

存储。

 

四、restful架构

RESTful是一种基于资源的软件架构风格。RESTful API是基于HTTP协议的一种实现。

请求方法:

》GET : 请求获取Request-URI所标识的资源

》POST : 在Request-URI所标识的资源后附加新的数据

》HEAD : 请求获取由Request-URI所标识的资源的响应消息报头

》PUT : 更新资源时常用,用于请求服务器存储一个资源,并用Request-URI作为其标识

》DELETE : 请求服务器删除Request-URI所标识的资源

》OPTIONS : 请求查询服务器的性能,或者查询与资源相关的选项和需求

常用状态码

200 OK //客户端请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求