PHP数组操作

数组转换为字符串(序列化、持久化)

为什么要序列化?

  • Api接口通信

  • 数据缓存

  • 数组数据持久化(例:保存到数据库中)

序列化的方法?

  • 方法一:函数 serialize() 可以实现

  • 方法二:函数 json_encode ()可以实现

  • 方法三:函数 var_export($items, true);

  • 方法四:xml、其他自定义文件格式…

  • 方法五:mcpack、protobuffer等二进制序列化方式

合并两个数组

通常我们会用到+运算符 或者array_merge函数。

数组合并中+运算符 与 array_merge 的区别?

array_merge

  • 一个数组中的值附加在前一个数组的后面

  • 字符串键名,则该键名后面的值将覆盖前一个值

  • 数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

  • 数字键名将会被重新编号。

  • 也可以是一个参数,并且该数组是数字索引的,则键名会以连续方式重新索引

+运算符

把右边的数组元素附加到左边的数组后面,两个数组中都有的键名(索引和数字),则只用左边数组中的,右边的被忽略。

区别:

  • array_merge :覆盖,相同数字键追加。

  • +运算符:补充,相同数字键忽略。

示例:

通常我们的用法是有字符串键值,去覆盖

$a = array('id' => 1, 'name' => 'kitt', 'sku' => '123456');
$b = array('name' => 'kitt1', 'title' => 'hello');

print_r($a+$b);
print_r(array_merge($a,$b));

结果:

Array ( [id] => 1 [name] => kitt [sku] => 123456 [title] => hello ) 
Array ( [id] => 1 [name] => kitt1 [sku] => 123456 [title] => hello )

数组运算符

PHP数组元素查找

  • 判断key是否存在:array_key_exists() 和 isset()

  • 判断值是否存在: in_array() 和 array_search()

  • 依据键返回值: $items[$key]

  • 依据值返回键: array_keys ($items,$value);

  • 依据给定值进行模糊查找:preg_grep();

PHP数组元素的过滤和移除

  • 方法1:直接用unset移除元素

  • 方法2:array_slice从数组中取出一段

  • 方法3:array_splice把数组中的一部分去掉并用其它值取代

  • 方法4:用array_filter过滤元素

  • 方法5:用array_shift()将开头的元素移出数组

  • 方法6:用array_pop ()将最后一个元素弹出

PHP数组排序的原理

由于数组排序并不会改变数组中的元素,而只是改变了数组中元素的位置,因而,对底层而言,实际上只是对全局的双链表进行排序。

申请n个额外的空间(n是数组元素个数)

然后遍历双链表,将双链表的每个节点存储到临时空间

调用排序函数zend_qsort(内部是快速排序算法)对数组进行排序

排序之后,双链表中节点的位置发生了变化,因而需要调整指针的指向。

遍历数组,分别设置每一个节点的pListLast和pListNext

最后设置HashTable的pListTail

PHP数组排序函数的一般特点:

  • 需要额外的空间,因而应该尽量避免对很大的数组排序.

  • 底层使用快速排序。

PHP数组排序函数对比

与PHP数组相关的其他函数

  • count

  • is_array

  • print_r

  • explode

  • implode(join)

  • extract 从数组中将变量导入到当前的符号表

  • http_build_query 生成 URL-encode 之后的请求字符串

  • parse_str

PHP数组函数分类

  • 数组遍历相关函数:如prev, next, current, end,reset, each等

  • 数组排序相关:如sort, rsort, asort, arsort, ksort, krsort, uasort, uksort

  • 数组查找相关: 如in_array, array_search, array_key_exists等

  • 数组分割、合并相关: array_slice, array_splice, implode, array_chunk, array_combine等

  • 数组交并差:如array_merge, array_diff, array_diff_*, array_intersect, array_intersect_*

  • 作为stack/queue容器的数组: 如array_push, array_pop, array_shift

  • 其他的数组操作:array_fill, array_flip, array_sum, array_reverse等

Last updated