在 PHP 和 WordPress 中如何给数组切片
从一个数组中取出一段数据,或者说切片,这是非常常见的数组操作,PHP 已经内置了了 array_slice
函数来实现这个操作,但是面对关联数组的一些基于 key 的切片操作,该函数就有点力不从心了,那么我们面对这些复杂的情况,怎么操作呢?今天就通过这篇文章详细讲解一下在 WordPress 中如何给数组切片。
还是从 array_slice 说起
array_slice
的简介就是从数组中取出一段,它是从指定偏移量开始提取特定数量的元素,具体的语法:
array_slice(array $array, int $offset, int $length, bool $preserve_keys = false)
$array
:待切片的数组。$offset
:切片开始的位置,从 0 开始计数,支持负数,从末端开始算起。$length
:切片元素的长度。$preserve_keys
(可选):是否保留切片元素的键名,默认值为false
。注意无论本参数如何设置,都会保留字符串的键。
还是看具体的例子吧。
// 从数组中取出第一个元素
$slice = array_slice([1, 2, 3, 4, 5], 0, 1); // [1]
// 从数组中取出第二个和第三个元素
$slice = array_slice([1, 2, 3, 4, 5], 1, 2); // [2, 3]
如果是用负偏移量,将从数组末尾开始计数:
// 从数组中取出倒数第二个元素
$slice = array_slice([1, 2, 3, 4, 5], -2, 1); // [4]
如果不指定长度,则切片将包括从偏移量到数组末尾的所有元素:
// 从数组中取出第二个和之后所有的元素
$slice = array_slice([1, 2, 3, 4, 5], 1); // [2, 3, 4, 5]
如果将 $preserve_keys
参数设置为 true
,则切片元素将保留其原始键名:
// 从数组中取出第二个元素,并保留键名
$slice = array_slice([1, 2, 3, 4, 5], 1, 1, true); // [1 => 2]
对于关联数组,则 $preserve_keys
不管参数是什么值,都会保留原始的键:
// 从关联数组中取出第二和第三个个元素,下面都是输出 ['b'=>2, 'c'=>3]
$slice = array_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 1, 2, true);
$slice = array_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 1, 2);
关联数组如何切片
从上面的例子可以看出 array_slice
是基于偏移量和长度进行切片的,但是对于关联数组来说,如果我们要基于数组的 key 进行切片怎么操作?
WordPress 的 wp_array_slice_assoc
WordPress 内置有个 wp_array_slice_assoc
函数,它基于一个健的列表从关联数组中取出数组,具体的语法:
wp_array_slice_assoc( array $input_array, array $keys )
$input_array
:待切片的关联数组。$keys
:健的列表。
// 从数组中取出键为 c 和 b 的元素
$slice = wp_array_slice_assoc(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], ['c', 'b', 'f']);
// 结果为 ['c'=>3, 'b'=>2]
取出的数组是按照 $keys
参数的顺序取出来的,上面的例子中,我故意把 c 放到 b 前面,取出的关联数组的 key 的顺序也是按照这个顺序,另外数组中不存在的 key
,取出关联的数组也是不存在的,比如上面例子的 f。
WPJAM Basic 的 wpjam_slice
因为 wp_array_slice_assoc
取出的关联数组的顺序是按照输入的 $keys
参数顺序的,但是有些情况下我们要求取出的关联数组的顺序不要动,即不关系 $keys
的顺序,所以我在 WPJAM Basic 中加入了一个 wpjam_slice
函数,它取出的数组是不会变动的,具体的语法:
wpjam_slice( array $input_array, array $keys )
$input_array
:待切片的关联数组。$keys
:健的列表。
还是看具体的例子吧:
// 从数组中取出键为 c 和 b 的元素
$slice = wpjam_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], ['c', 'b', 'f']);
// 结果为 ['b'=>2, 'c'=>3]
最后取出的关联数组的是按照原先的顺序,并且不存在的 key
,取出关联的数组也是不存在的。
此外 $keys
参数除了数组之外,还支持字符串,通过空格或者逗号转化成数组:
// 从数组中取出键为 c 和 b 的元素,$keys 参数为逗号间隔字符串
$slice = wpjam_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 'c,b,f']);
// 结果也是 ['b'=>2, 'c'=>3]
// 从数组中取出键为单个元素
$slice = wpjam_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 'c']);
// 结果为 ['c'=>3]
这样 WordPress 中给数组如何切片,是不是方法更多了一下,哈哈!