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

时间:2022-01-01 07:52:53

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

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的区别?

  1. in_array和array_search

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

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

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

  2. 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中大量使用的匿名函数一样. 匿名函数的用法有这样几种:

  1. 将匿名函数赋值给一个变量, 然后通过变量来调用函数. $lamda = function () {....}; $lamda();
  2. 在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的匿名函数和闭包的区别?