一、用函数对数组进行去重的方法
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 //服务器当前不能处理客户端的请求