您的位置:首页 > 编程语言 > PHP开发

php数组操作集锦- 掌握了数组操作, 也就掌握了php

2016-12-18 19:17 387 查看

作为只是作为一种生存手段, 搞技术不用钻牛角尖! 有些东西, 只要大致了解, 如果已经进行了深入的了解, 但还是不能解决,就不要继续了...

"专"相关的字, 只有 "钻" 金属旁的是zuan, 其余的都是 "zhuan" 包括: 转, 传, 专心.等等..

其时, 要想掌握php下的所有的: 数组/字符串 的操作函数, 那是不现实的, 你不可能把所有的函数都 记住清楚, 而且也没有必要! 还是那句老话, 把常用的记住, 其他的只是在需要的时候, 再查.

因为php 几乎包含了, 所有的, 满足一切的 数组/字符串的操作 函数. 因此, 如果遇到需求的代码, 需要数组或字符串的处理, 要先查阅 : 提供php的信息, 和需求, 然后看有没有相应的函数...

列表, 列表中同样可以使用其他markdown样式, 如列表中, 使用 井号等等..

程序元的美德!

the three chief virtues of a programmer are : laziness, impatience, hubris...

懒惰, 追求自动化;

急躁,不耐烦,

hubris: 狂妄,自大,傲慢...

让一切都尽可能自动化起来的哲学起源于'

UNIX世界的哲学:

小即是美
让程序只做好一件事
尽可能早地创建原型(然后逐步演进)
数据应该保存为文本文件
每个工具只做且做好一件事
工具可以协作起来
一切面向文本 (一切尽量以 配置文件 ini的方式来实现)...
避免使用可定制性低下的用户界面

在linux下, 有很多的工具和命令行, 来处理繁琐的, 复杂的配置工作, 比如apache的配置, 等等....

参考下面的文章, 是很好的:

http://www.cnblogs.com/staven/p/5142515.html

http://pcwanli.blog.163.com/blog/static/453156112010111441852254/

php为什么如此强大好用? 很重要的一个因素是, 它提供了众多的 功能强大的 内置函数.而且这些函数是非常灵活的,"有句套话是: php做到了怎么方便怎么来, 怎么好用就怎么用", 基本上你想到的功能, 函数都提供了. 基本上你不用自己去编写处理函数了, 你只需要编写自己的 逻辑函数和 业务函数就好了.

php编程的一个基本思想, 由于 php是弱类型语言, 函数中的参数, 没有指定/ 规定 参数的 数据类型, 也没有规定返回值的类型, 因此, 在使用函数的时候, 一定要 时时 考虑, 或者检查参数的数据类型, 要事先对参数 类型作检查处理: if(is_file, is_array()...is_string...is_numeric...)等等, 因为不同类型 的参数传入时, 返回值甚至 返回类型都是不同的 也要对函数的返回值 作处理. 而且要注意 类型的隐含 转换和相等.

同时, php函数, 也大量使用 参数的 省略值, 所以, 在使用函数的时候, 也要时时提醒自己, 函数是否有省略值, 不要以为函数的 原型就是 你平常使用的那样!

常说php有很多坑, 可能就是说的上面的亮点吧???

php的两个主要操作点就是, 数组和字符串. 而数组的操作更多. 基本上, 只要掌握了数组的操作, php就完了. 因此, 平时编程的思路就是, 尽量把 问题, 转化成 数组来进行处理.

取数组的值或键:

array_keys($array): 取出键, 用数字索引

array_keys($array, '四川'); 也可以 根据值, 只取出指定 value的 键.

array_values($array): 取出数组的值, 主要有两个使用场合和作用, 一是只需要值, 去掉key, 二是原来的keys比较混乱, 要去掉原来的keys.

注意区分 array_keys和 key函数 的区别?

array数组, 本身就提供了 遍历 数组内的元素的 方法,(通过数组内部的指针的移动) 如 获取当前元素的key值和元素值的函数: key(), current(), 注意这个不是value. 而数组指针的移动有: next(), previous(), last(), 最前面的指针方法: reset().

注意, 对php中的数组操作函数, 由于php对数组的处理, 是按照数组来处理的, 不是按照对象来处理的, 所以, 基本上关于数组的操作, 都是 全局函数, 而不是 对象的点 操作方式.

数组中, 三个搜索函数in_array, array_search, array_key_exists的区别?

in_array和array_search

两者都是判断 数组元素的值 是否存在, 但是两者的返回值 不同.

in_array是判断 数组元素的值 是否存在, 返回值是bool类型, 存在为true, 不存在为false.

array_search 是判断数组元素的值 是否存在, 但是它返回的是 如果元素值存在返回对应的key值 , 如果不存在,也返回false,就是说, array_search返回的是key值.

arry_key_exists和isset

这两者搜索的是数组元素的key. 区别是, 如果key对应的元素值为null或false, 则isset返回false, 而array_key_exists仍然返回true.注意后者函数的用法, arry_key_exists参数的顺序是: array_key_exists('要查询的key', $arr); 参数的顺序不要搞反了.

怎样才能做到 写代码就像写文章一样优雅, 有趣??? 其实, 写英文文章写多了, 你就会有那种感觉了,用写英文文章的思路和习惯来写代码, 你就不会感到累! 感觉写代码写起来就是一件很 有韵律, 很优雅的一件事, 自然你的代码就会" 显得 " 更好, 你的感觉也会更好. 一个最重要的原则就是, 写代码要 以 "单词" 为单位, 除了大中小括号外, 其余的单词之间都要用空格加以分隔. 当然, 最严格的是连各种括号都要分隔, 但是那样可能会影响写代码的速度.一般做到上面 两点就不错了.

数组的快速生成?

使用range函数, 可以快速的生成 指定范围内的 数组值. $arr = arrage(1, 10); 这时 $arr就是数组了. 但是, 要注意, 这样的话, 数组的值是1, 到 10, 而数组的下标的值 却是: 0 ~ 到 9.

array_merge和array_combine的区别

前者是元素值的组合, 而后者是两个数组, 一个作为keys, 另一个作为values的对应 结合.

数组搜索的区别?

isset和array_key_exists是 搜索key, 两者的区别是前者对于key=>null, 返回的是false, 后者即使是key=>null也返回true

in_array和array_search是 搜索value, 但是in_array返回的是值是否存在的true/false. 而array_search返回的是 false(不存在值时),值存在时则返回对应的key

array_filter和 array_map的区别? 对数组元素过滤?

array_filter 是对数组元素 使用 callback function 函数进行 过滤. 有的元素, 会被 removed. 在过滤
flase, null ,""而保留 0时, 要使用 strlen作callback函数


array_filter函数的特点: 第一, 它不会改变 数组元素的本身, 元素本身的值跟你的return 完全没有关系! 这一点必须明确, 不管你的回调函数如何写! 第二, 它是根据 return的值的 false/true, 来决定去留的, 就这么单纯.

而 array_map则是对所有的数组元素, 都使用 回调函数, 它不会 过滤/删除元素的. **和array_filter不同的是, 它们的参数顺序不同! 由于array_map可以 带多个数组, 如 $arr1, $arr2..., 所以 要处理的 数目/个数不确定的 数组序列 要放在函数的后面, 因此, 第一个参数 是 callback, 这个跟 array_filter第一个参数是数组, 第二个参数才是callback不同!

特别注意的是, 如果array_map的第一个参数callback是null的时候, 后面是多个数组时, 返回的是由这些数组组成的二维 数组, 但是,不同于 array_merge! (array_merge返回的是一维 数组!!!)

array_map? 和 array_walk?

array_map 的主要目的是对数组的元素使用 函数回调处理, 目的是为了返回处理后的数组;

array_walk 的主要的目的是, 依次取出数组中的元素, 然后做处理, 目的是为了处理后的结果.如同foreach一样, 也是遍历数组中的元素, 取出来进行处理. 但是, foreach处理的代码是 {代码块....}, 而array_walk更进一步, 是用一个完整的函数来进行处理的. (同样的, 需要一个全局函数, 如果是在类里面, 也要使用 lamda匿名函数). 如果使用array_walk对 数组中的原元素进行处理, 就要在自定义函数中传入 元素的 引用, 参数的顺序是: 
&$v, $k


对于php而言, 表达式返回的值, 如果是赋值表达式, 则返回的是, 被赋值的变量的值, 如果没有赋值, 只是算数表达式, 则返回算术式子的计算结果.

对于array_walk, 由于不需要返回值, (只是处理), 所以, 最后并不需要写 return 语句, 而且, 这里, 即使你写了return语句, 也没有任何效果(因为return不产生输出!)而 array_walk 的返回值是逻辑值, 即boolean,是看回调函数是否应用成功,即回调函数是否出错的布尔值! 但是对于 array_map(和array_filter也是这样), 由于最后要返回值, 所以一定要加 return语句, 否则, 如果只是赋值, 如:
$v = $v * 2;
由于没有返回值, 所以最后返回的数组元素值都是null.

php5.3的回调函数和闭包! 因此, 今后就可以像写js那样灵活的, 舒服的写回调函数了!!

php中的大量函数使用了 回调函数(callable callback). 在php5.3之前, 由于不支持 lamda函数和闭包, 所以必须先定义一个函数, 然后, 再传入这个函数名的字符串. 这个就比较麻烦. 从5.3开始, 就可以 使用 匿名函数和闭包了.

lamda函数: 从Lisp系的scheme语言而来的, 在scheme语言中,定义一个匿名函数就是用 lamda关键字的.

lamda函数, 就是通常所说的匿名函数.用法如同在javascript中大量使用的匿名函数一样. 匿名函数的用法有这样几种:

将匿名函数赋值给一个变量, 然后通过变量来调用函数.
$lamda = function () {....};  $lamda();


在php的函数中, 凡是需要 callback的地方, 都直接用 lamda函数: 如
array_filter($arr, function($v){..}


**第二种方式中, 在 类 里面使用 回调函数的时候, 就 非常有用了! 就不会很麻烦地使用 类方法作回调函数名称了! 而且如果你直接使用 "类的方法(不管是public还是private的)作为回调函数都是不行的.., 即使你使用 '$this-> callback_class_method' : 因为回调函数要求的是, 一个 "全局函数"

在中文输入法中, 由于大多数输入法都支持 "直接上文/直接显示在"正文"中", 所以输入时, 用不着看输入条, 直接看输入的正文就好了. 经常发生的/ 为什么老是出错呢?是因为你在输入的时候, 实际上, 眼睛是处于 "暂时的 盲点 /黑视"的.

prag'matic: 务实的, 切合实际的: we need to adopt a more pragmatic approach.

php的匿名函数和闭包的区别?

<script type="text/javascript">
function(){  // 这个就是匿名函数, 即只是写function, 不写函数名
var i=1;
function b(){  // 闭包就是一个函数中 再定义的 函数. 闭包可以使用 包含它的函数中的 变量...
++i;
return i;
}
return b;
}
var c=a();
alert(c());
</script>

闭包会携带它的函数的作用域,因此会比其他函数占用更多的内存,所以使用闭包要非常注意!!!

list函数,“列表”, 表示将数组中 对应的 元素值 相应的赋值给 多个变量...

explode和implode是在数组和字符串之间转换, 转换的分隔符不能为空: 如果delimiter为空, 则

会产生一个警告: empty delimiter...

数组排序用sort, 这个sort($arr)是改变$arr这个数组本身的, 不是返回一个排序后的数组, sort返回的是一个bool值, 看是否排序成功...

数组倒序用array_reverse, 这个倒序是不分 大小等, 绝对的按顺序颠倒的... 而array_flip是数组翻转, 是将key和value进行翻转...

php数组还是使用 array(1,2,3,4)的形式, 不使用[1,2,3,4]. 很多时候, 好像会出现解析错误!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: