duzun / array
PHP 中有用的数组方法
0.0.3
2019-11-28 21:22 UTC
Requires
- php: >=7.1
This package is auto-updated.
Last update: 2024-08-29 05:00:32 UTC
README
PHP 有用的数组方法
use duzun\ArrayClass as AC;
方法
::to_array
尝试将值转换为数组,或者当无法转换时返回值。
ArrayClass::to_array($object, $recursive=false)
$object
可以是 Generator
、Traversable
或任何具有 ::getArrayCopy()
方法的对象。
示例
AC::to_array(1); // [1] AC::to_array((function() { yield 1; })()); // [1] AC::to_array(new \ArrayObject([1,2,3])); // [1,2,3] AC::to_array($o = new class {}); // $o - don't know how to convert :(
::is_assoc
检查数组是否为关联数组(索引数组)。
ArrayClass::is_assoc($array, $strict = true): bool
示例
AC::is_assoc(['a','b','c']) === false; AC::is_assoc([1 => 'a', 2 => 'b', 3 => 'c']) === true; AC::is_assoc([1 => 'a', 2 => 'b', 3 => 'c'], false) === false; AC::is_assoc(['x' => 'a', 2 => 'b', 3 => 'c'], false) === true;
::repeat
重复数组的值指定次数(比 array_fill()
更强大)。
ArrayClass::repeat(array $array, int $times): array
示例
// the most trivial case, same as array_fill(0, 3, 1); AC::repeat([1], 3) === [1,1,1]; AC::repeat([1,2], 2) === [1,2,1,2]; // $times has to be positive AC::repeat([1], 0) === []; AC::repeat([1], -5) === []; // doesn't preserve keys, ever AC::repeat(['a' => 1, 'b' => 2, 'c' => 3], 3) === [1,2,3,1,2,3,1,2,3]; AC::repeat(['a' => 1, 'b' => 2, 'c' => 3], 1) === [1,2,3];
::cyclic_slice
类似于 array_slice()
,但循环的,就像数组是一个环,我们可以从任何点以顺序方式取出任何数量的项。
ArrayClass::cyclic_slice( array $array, int $offset, int $length = NULL, bool $preserve_keys = false ): array
示例
AC::cyclic_slice(['a','b','c','d','e'], 1) === ['b','c','d','e','a']; // rotate by 1 AC::cyclic_slice(['a','b','c','d','e'], -1) === ['e','a','b','c','d']; // rotate by -1 AC::cyclic_slice(['a','b','c','d','e'], 1, 2) === ['b','c']; // slice 2 items AC::cyclic_slice(['a','b','c','d','e'], 1, -2) === ['b','a']; // slice 2 items in reverse // slice, while cycling, to fulfill the length AC::cyclic_slice(['a','b','c','d'], 3, 9) === ['d','a','b','c','d','a','b','c','d']; AC::cyclic_slice(['a','b','c','d'], -3, -9) === ['b','a','d','c','b','a','d','c','b']; // preserve keys AC::cyclic_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4], 3, 3) === ['d'=>4, 'a'=>1, 'b'=>2];
::id
给定一个通过 ID 的项目列表,获取一个不在列表中存在的新 ID。
ArrayClass::id($array): int
示例
AC::id( NULL ) === 1; AC::id( [1] ) === 1; AC::id( [2=>1] ) === 3; AC::id( [9=>0, 10=>1, 11=>2] ) === 12;
::group
根据字段列表对数组中的数组项进行分组。
ArrayClass::group($list, $fields, $as_list = false): array
示例
// Given an array of arrays: $array = [ [ 'a' => 1, 'b' => 3, 'c' => 7 ], [ 'a' => 1, 'b' => 3, 'c' => 8 ], [ 'a' => 1, 'b' => 5, 'c' => 9 ], [ 'a' => 2, 'b' => 3, 'c' => 10 ], [ 'a' => 2, 'b' => 5, 'c' => 11 ], [ 'a' => 2, 'b' => 5, 'c' => 11 ], ]; // group by values of field 'a', preserving the last appearance AC::group($array, ['a']) == [ 1 => [ 'a' => 1, 'b' => 5, 'c' => 9 ], 2 => [ 'a' => 2, 'b' => 5, 'c' => 11 ], ]; // group by values of field 'a', preserving all items by adding an extra level of depth. AC::group($array, ['a'], true) == [ 1 => [ [ 'a' => 1, 'b' => 3, 'c' => 7 ], [ 'a' => 1, 'b' => 3, 'c' => 8 ], [ 'a' => 1, 'b' => 5, 'c' => 9 ], ], 2 => [ [ 'a' => 2, 'b' => 3, 'c' => 10 ], [ 'a' => 2, 'b' => 5, 'c' => 11 ], [ 'a' => 2, 'b' => 5, 'c' => 11 ], ], ]; // group by two fields, preserving the last appearance AC::group($array, ['a', 'b'], false) == [ 1 => [ 3 => [ 'a' => 1, 'b' => 3, 'c' => 8 ], 5 => [ 'a' => 1, 'b' => 5, 'c' => 9 ], ], 2 => [ 3 => [ 'a' => 2, 'b' => 3, 'c' => 10 ], 5 => [ 'a' => 2, 'b' => 5, 'c' => 11 ], ], ];
请参阅代码文件中的其他方法 ArrayClass.php 和测试文件 ArrayClass.Test.php。
@TODO 测试并记录所有其他内容