php数组去重、魔术方法、redis常用数据结构及应用场景

mac2022-06-30  22

一、用函数对数组进行去重的方法 1、 arrau_unique函数的作用 移除数组中重复的值。 将值作为字符串进行排序,然后保留 每个值第一次 出现的健名,健名保留不变。 第二个参数可以选择排序方式: SORT_REGULAR - 按照通常方法比较(不修改类型) SORT_NUMERIC - 按照数字形式比较 SORT_STRING - 按照字符串形式比较 SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。   2、同样的 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版本   一下是简单的举例,详情见: https://www.cnblogs.com/baocheng/p/5607216.html $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 //服务器当前不能处理客户端的请求                    

转载于:https://www.cnblogs.com/bestvish/p/10560947.html

最新回复(0)