PHPer 高手之路
  • Introduction
  • First Chapter
  • 基础
    • 数据类型和常量
    • 字符串
      • 字符编码
      • 字符编码相关编程
    • 引用变量
    • 运算符与错误控制符@
    • 流程控制与条件判断
      • foreach遍历中的引用
    • 函数
    • 文件及目录处理
  • PHP 数组
    • 基础
    • PHP数组操作
    • 输入流 php://input
    • PHP数组的内部实现
    • PHP数组和数据结构
    • 示例技巧
  • PHP文件编程
    • 文件系统
    • 基础
    • 实例技巧
    • PHP中XML处理
    • PHP中JSON处理
    • PHP中CSV处理
    • 大文件上传
  • 正则表达式
    • 基础
    • 正则的引擎
    • 表达式的优化
    • PHP中正则的使用
  • PHP 编码技巧
    • PHP编码习惯
    • PHP语法糖
    • PHP代码优化
    • PHP重点新特性
    • PHP编码规范
  • PHP选项和运行原理
    • PHP SAPI
    • PHP运行模式及安装方式
    • 附录:进程和线程的Q解
    • Apache下的MPM模式
    • Apache 与 Nginx
    • PHP的运行机制及原理
    • PHP垃圾回收机制
    • PHP配置选项
  • PHP安全
    • 跨站脚本攻击(XSS )
    • 跨站请求伪造(CRSF)
  • PHP 高级特性
    • 异常处理(Exceptions)
    • 代码复用(Trait)
    • 预定义接口(Predefined Interfaces)
    • 魔术方法(Magic Methods)
    • 回调函数、匿名函数&闭包
    • 命名空间(Namespaces)
    • 自动加载(Autoload)
    • 反射(Reflection)
    • 魔术常量(Magic constants)
    • 综合实例
  • 附录:关键词
  • 附录:资料
  • 代码的版本控制
    • SVN
    • Git
      • 疑难杂症
  • Linux
    • Linux原理与基础
    • 常见命令
    • Shell 编程
    • awk 与 sed
    • 命令笔记
  • HTTP 协议
    • 请求方法与返回状态码
    • Cookie、Session 的原理
  • MySQL
    • MySQL表存储引擎
  • 标准PHP库(SPL)
    • 数据结构
      • SplPriorityQueue - 优先队列
      • SplQueue - 队列
      • SplStack - 栈的功能
    • 接口
      • Countable - count统计接口
  • 附录:ElasticSearch
  • PHP数据结构
  • 附录:Rabbitmq
  • 附录:guzzle
  • JavaScript
    • 附录:资料
  • 疑难杂症
Powered by GitBook
On this page
  • 数组转换为字符串(序列化、持久化)
  • 合并两个数组
  • 数组运算符
  • PHP数组元素查找
  • PHP数组元素的过滤和移除
  • PHP数组排序的原理
  • PHP数组排序函数对比
  • 与PHP数组相关的其他函数
  • PHP数组函数分类

Was this helpful?

  1. PHP 数组

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等

Previous基础Next输入流 php://input

Last updated 5 years ago

Was this helpful?