马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 mumudontcry 于 2017-4-6 20:43 编辑
写在前面
本来想要继续讲 PHP 的类的,只不过……在回顾了之前的帖子之后,我发现忘记了几个重要的东西,所以,这里我开始穿插着讲,而忘记的这些东西就是一些 PHP 里的数组和字符串函数!
PHP 常用数组函数
忘记的童鞋返回到数组的作业部分,传送门
我们会分几次去讲解这些函数,等木木整理好类的其他内容,再回过来讲类(如果你只要对类有一个概念的理解,前一讲就够了~~)
array_diff
<?php
$a1 = array(
"a" => "red",
"b" => "green",
"c" => "blue",
"d" => "yellow"
);
$a2=array(
"e" => "red",
"f" => "green",
"g" => "blue"
);
$result = array_diff($a1, $a2);
运行如下array(1) {
'd' =>
string(6) "yellow"
}
PHP 的数组也对应了数学里的集合的概念,其实为了简化 PHP 这门语言,设计者已经把很多概念都弱化了,如果你学过 python,你会发现同样是几个东西凑合在一起的另一个东西,有特别多的种类,但是 PHP 只有一个数组!
这个函数的意思对应了数学里的“差集”,从运行结果里可以看到,实际上就是表示,第一个数组里有,但是第二个数组里没有的
这个函数只用数组元素的值去做减法,如果要键也对应,那么应该使用 array_diff_assoc,此时的“减法”将会对比键和值
array_filter
过滤数组里值为 false 的元素,在之前讲布尔值的时候我们有说过 PHP 里布尔值为 false 的值有哪些,因此这里不再赘述,例如以下的元素全部都会被干掉,最后的值是一个空数组<?php
array_filter([0, '0', '', null]);
此外,这个函数也支持第二个参数,类型为一个函数,此时 PHP 会把数组里每个元素传入第二个参数的函数里,返回值为 false 的也被过滤,有了这个自定义函数,我们就可以做很多事情了!
array_intersect
求两个数组的交集,如果想要比较键,那么请使用 array_intersect_assoc,不再举例
array_merge
将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
输出Array
(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => trapezoid
[4] => 4
)
这里我们可以猜想,当一个元素是一个数组,而这个元素的键是字符串时,后面的元素是会被覆盖掉的,我们如何去把两个字符串键的元素合并起来呢?使用 array_merge_recursive,这个函数会递归地去合并几个数组
array_unique
这个函数会把相同的值的元素处理成唯一,例如<?php
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
输出Array
(
[a] => green
[0] => red
[1] => blue
)
是的,后面的元素被丢掉了~~
总结
我们来看看为什么把这几个函数放在一起,array_diff(差集),array_filter(过滤 false 的元素),array_intersect(交集),array_merge(并集),array_unique(去重)
很明显我们可以发现,这几个函数可以说是将 PHP 的数组从数学的集合角度去处理!
当然,如果你再好好看手册,你会知道这些函数也有一些其他参数,嗯……复杂的我也不去介绍,如果你真的遇到了这些操作,等到了那时候再看也 ok,而我不介绍这些复杂参数的其中一个理由就是:对待 PHP 函数,我们大可不必那么严谨(众人:你这样真的好么?)
为什么这么说,我们来这样举个栗子,假如你从一个数据库(众人:喵喵喵?数据库?木木:你就当作一个列表好了)已经找到了一些名字,这是你的第一份名单
此时你需要知道一个这样的结果:有哪些人的名字呢?没问题,用 array_unique !重复名字去掉就好啦
这时候,隔壁老王又拿到了一份名单(嗯……这些名字为什么都姓王? ),如果你想知道,两份名单一共有哪些名字?没问题,用 array_merge !合并起来,然后再 array_unique 一下,把重复的去掉(什么?你的名单里也有姓王的? )
如果你想知道,第一份名单里有,第二份名单里没有的?或者两份名单里都有的?……等等一系列问题,都可以直接用上面说过的几个集合函数
更……夸张的是,我们从数据库里查询出来的数据,通常都是一个索引数组(也就是,键都是自然数的),那么还哪里用得到那些跟键有关的,比如 array_diff_assoc 这样的函数啊!
而 PHP 最常见的场景恰好就是和数据库的交互,因此,对于处理集合的操作,以上函数就 ok 啦!
兰儿(然而),小伙伴在使用这些函数的时候心里还是要有数:我的数据已经被处理成了这些函数可以处理的格式了(比如,不需要管键的情况),然后你才可以蒙着眼拿那些函数各种使用,否则……还是睁着眼吧(多打印看结果肯定没有问题啦)
作业
已知有三个数组 $a, $b, $c 对应图中的三个圆圈 A,B,C,现在我怎么样才能得到黑色区域的值?
#################### 华丽的 PHP 版分割线 ####################
如果喜欢木木的讲解,就点击下方的订阅(读作:打赏),给木木点个赞吧,欢迎大家提出建议或者指正
一块钱买不了皮肤,买不了香烟,却可以跟着木木一起打怪升级,并给木木巨大的支持,有了大家的力量,木木就可以制造元气弹,打败……嗯,买一个好一点的女朋友啦 |