关于数组操作,php 与 js 的方法都比较相似(甚至名称都是一样的)。但也有区别,就是 js 的方法基于数组对象调用,而 php 是调用库函数,对数组(地址传递)进行操作。

之前写过 js 数组添加元素和删除元素,php 操作基本一致。

// 从尾部插入一个或多个元素
array_push($arr, $var);
// 删除最后一个元素
array_pop($arr);
// 获取数组切片
array_slice($arr, $offset, $length);
// 从数组中删除部分,并用其他值替换
array_splice($arr, $offset, $length, $replacement)

其中最后一个 array_splice 函数可以通过组合偏移量,删除长度和替换数组,实现删除,插入,替换等多种数组操作。array_splice 因为是地址传递,所以会直接修改传入的数组。并且不会像 unset 删除元素留下空白元素,在明确删除元素位置和删除数量的时候是很方便的。

但当只知道元素值,而不知元素在数组中的键名或索引,此时,就需要借助 array_search($arr, $var) 或者 array_keys($arr, $search) 来获取。而这两个函数存在一些使用上的问题需要做抉择。

array_search 是在数组中搜索值,找到返回键值,找不到返回 false。如果直接将 array_search 结果放到 array_splice 中,就会存在误删的可能。因为 array_splice 的第二个参数要的 int 类型,当 false 作为参数传递进去会转化为 0 ,则会从数组头部开始删除数据,而这些数据并不是预期删除的项。

array_keys 因为第二个参数的存在,使得该函数除了获取所有数组键值的功能以外,还可以搜索值,返回搜索到的键值数组。因为 array_splice 函数第二个参数是 int 类型,与 array_keys 的返回值类型不一致,所以不能直接使用。如果用索引 0 获取匹配元素的键值,可能会出现索引 0 不存在的错误(未匹配到)。

array_splice 因为会改变数组结构,所以不适用在需要保存原有数组的情况,这时可以选择使用 array_diff($arr, $arr1)array_diff 属于值传递,返回 $arr 数组中存在而在其他数组中不存在的元素集合(数组)。