鱼C论坛

 找回密码
 立即注册
查看: 3269|回复: 1

[技术交流] 【php包教不包会系列13】PHP 类型之数组函数之一

[复制链接]
发表于 2017-4-6 20:40:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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 啦!

兰儿(然而),小伙伴在使用这些函数的时候心里还是要有数:我的数据已经被处理成了这些函数可以处理的格式了(比如,不需要管键的情况),然后你才可以蒙着眼拿那些函数各种使用,否则……还是睁着眼吧(多打印看结果肯定没有问题啦)

作业

微信截图_20170406203648.png
已知有三个数组 $a, $b, $c 对应图中的三个圆圈 A,B,C,现在我怎么样才能得到黑色区域的值?

#################### 华丽的 PHP 版分割线 ####################



如果喜欢木木的讲解,就点击下方的订阅(读作:打赏),给木木点个赞吧,欢迎大家提出建议或者指正

一块钱买不了皮肤,买不了香烟,却可以跟着木木一起打怪升级,并给木木巨大的支持,有了大家的力量,木木就可以制造元气弹,打败……嗯,买一个好一点的女朋友啦

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-30 12:31:49 | 显示全部楼层
为什么到这一贴就停止了呢?已经好久没有更新了。。。看完了没得看了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 18:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表