marsapp / arrayhelper
ArrayHelper 库,提供重建索引、分组、获取内容、递归差集、递归排序等功能。
Requires
- php: ^7
Requires (Dev)
- phpunit/phpunit: ^6
This package is auto-updated.
Last update: 2024-09-10 19:47:01 UTC
README
数组处理库,提供重建索引、分组、获取内容、递归差集、递归排序等功能。
marshung/helper 的延续库,仅保留和维护 ArrayHelper
概要
安装
Composer 安装
# composer require marsapp/arrayhelper
包含
在使用前包含 composer 自动加载器。
require __PATH__ . "vendor/autoload.php";
用法
示例
命名空间使用
// Use namespace use marsapp\helper\myarray\ArrayHelper; // Data $data = [ ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'], ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2'], ]; // Index by ArrayHelper::indexBy($data, ['c_sn', 'u_no']); // Get name by a110 => a001 => u_name $name = ArrayHelper::getContent($data, 'a110, a001, u_name'); // $name = name1;
API 参考
indexBy()
通过键重新索引数据
indexBy(Array & $data, Array|String $keys, Bool $obj2array = false) : array
由于 $data 是引用,$data 在执行 indexBy() 后将改变。
由于 $data 是引用,返回值是无效的。
如果您想保留 $data,可以在使用前对其进行克隆。
示例
$data = [ ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'], ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2'], ]; ArrayHelper::indexBy($data, ['c_sn','u_sn','u_no']); // $data = [ // 'a110' => [ // 'b1' => ['a001' => ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1']], // 'b2' => ['b012' => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2']], // ], // ];
groupBy()
通过键重新索引和分组数据
groupBy(Array & $data, Array|String $keys, Bool $obj2array = false) : array
由于 $data 是引用,$data 在执行 indexBy() 后将改变。
由于 $data 是引用,返回值是无效的。
如果您想保留 $data,可以在使用前对其进行克隆。
示例
$data = [ ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'], ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2'], ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'user name 3'], ]; ArrayHelper::groupBy($data, ['c_sn','u_sn','u_no']);
$data 结果
[ 'a110' => [ 'b1' => ['a001' => [ 0 => ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'] ] ], 'b2' => ['b012' => [ 0 => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2'], 1 => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'user name 3'] ] ], ], ];
indexOnly()
通过键重新索引,无数据
indexOnly(Array & $data, Array|String $keys, Bool $obj2array = false) : array
由于 $data 是引用,$data 在执行 indexBy() 后将改变。
由于 $data 是引用,返回值是无效的。
如果您想保留 $data,可以在使用前对其进行克隆。
示例
$data = [ ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'], ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2'], ]; ArrayHelper::indexOnly($data, ['c_sn','u_sn','u_no']);
$data 结果
[ 'a110' => [ 'b1' => [ 'a001' => '' ], 'b2' => [ 'b012' => '' ], ], ];
getContent()
通过索引获取数据内容
getContent(Array $data, Array|String $indexTo = [], Bool $exception = false) : array|mixed
示例
$data = ['user' => ['name' => 'Mars', 'birthday' => '2000-01-01']]; // No indexTo, get all $output = ArrayHelper::getContent($data); // $output: ['user' => ['name' => 'Mars', 'birthday' => '2000-01-01']]; // Target is array $output = ArrayHelper::getContent($data, 'user'); $output = ArrayHelper::getContent($data, ['user']); // $output: ['name' => 'Mars', 'birthday' => '2000-01-01']; // Target is string $output = ArrayHelper::getContent($data, 'user, name'); $output = ArrayHelper::getContent($data, ['user', 'name']); // $outpu: Mars // No target $output = ArrayHelper::getContent($data, 'user, name, aaa'); $output = ArrayHelper::getContent($data, ['user', 'name', 'aaa']); // $outpu: []
getFallContent()
获取下级内容
- 获取有序非连续索引数组中的数据
- 如果没有下级点,则返回 null。
- 通过提前对 $data 排序来确保性能
- a. 对 $data 排序(升序)
- b. 关闭 $sortOut
- c. 使用 ArrayHelper::getFallContent() 函数
getFallContent(Array $data, $referKey, $sortOut = 'default') : mixed
参数
- $data: 要比较的数组。数组
- $referKey: 比较的参考键。字符串
- $sortOut: 输入是否需要重新排列。值:true, false, 'default'。如果它是 'default',请参阅 getSortOut()
返回值
- 返回结果混合。
示例
$data = ['2019-05-01' => '20', '2019-06-01' => '30', '2019-06-15' => '50']; $value = ArrayHelper::getFallContent($data, '2019-06-11', false); // $value = 30;
gather()
按列表收集数据
根据字段列表收集和分类目标数据
gather(Array $data, Array $colNameList, Int $objLv = 1) : array
示例数据
$data = [ 0 => ['sn' => '1785','m_sn' => '40','d_sn' => '751','r_type' => 'staff','manager' => '1','s_manager' => '1','c_user' => '506'], 1 => ['sn' => '1371','m_sn' => '40','d_sn' => '583','r_type' => 'staff','manager' => '61','s_manager' => '0','c_user' => '118'], 2 => ['sn' => '1373','m_sn' => '40','d_sn' => '584','r_type' => 'staff','manager' => '61','s_manager' => '0','c_user' => '118'], 3 => ['sn' => '7855','m_sn' => '40','d_sn' => '2303','r_type' => 'staff','manager' => '71','s_manager' => '0','c_user' => '61'], 4 => ['sn' => '7856','m_sn' => '40','d_sn' => '2304','r_type' => 'staff','manager' => '75','s_manager' => '0','c_user' => '61'] ];
示例 1
字段
manager
,s_manager
,c_user values
放在同一个一维数组中
$ssnList1 = ArrayHelper::gather($data, array('manager', 's_manager','c_user'), 1);
$ssnList1 结果
[1 => '1',506 => '506',61 => '61',0 => '0',118 => '118',71 => '71',75 => '75'];
示例 2
字段
manager
放在一个数组中,字段s_manager
和c_user
的值放在同一个数组中。形成一个二维数组
$ssnList2 = ArrayHelper::gather($data, array('manager' => array('manager'), 'other' => array('s_manager','c_user')), 1);
$ssnList2 结果
[ 'manager' => [1 => '1',61 => '61',71 => '71',75 => '75'], 'other' => [1 => '1',506 => '506',0 => '0',118 => '118',61 => '61'] ];
diffRecursive()
数组递归定义
比较 $srcArray 与 $contrast,如果 $srcArray 中有不在 $contrast 中的内容,则显示它。
diffRecursive(Array $srcArray, $contrast) : array
示例
$data1 = [ 0 => ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'], 1 => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2'], 2 => ['c_sn' => 'a110', 'u_sn' => null, 'u_no' => 'c024', 'u_name' => 'name3'], ]; $data2 = [ 0 => ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'], 1 => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2222'], 2 => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'c024', 'u_name' => 'user name 3'], ]; $diff = ArrayHelper::diffRecursive($data1, $data2);
$diff 结果
[ 1 => ['u_name' => 'name2'], 2 => ['u_sn' => NULL,'u_name' => 'name3'] ];
sortRecursive()
数组递归排序
sortRecursive(Array & $srcArray, $type = 'ksort') : void
$srcArray 是引用
$type : ksort(默认),krsort,sort,rsort
示例
$data1 = [ 'b1' => [ 0 => ['c_sn' => 'a110', 'u_sn' => 'b1', 'u_no' => 'a001', 'u_name' => 'name1'] ], 'b2' => [ 0 => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'name2'], 1 => ['c_sn' => 'a110', 'u_sn' => 'b2', 'u_no' => 'b012', 'u_name' => 'user name 3'] ], ]; $data2 = $data1; ArrayHelper::sortRecursive($data1, 'ksort'); ArrayHelper::sortRecursive($data2, 'krsort');
$data1 结果
[ 'b1' => [ 0 => ['c_sn' => 'a110','u_name' => 'name1','u_no' => 'a001','u_sn' => 'b1'] ], 'b2' => [ 0 => ['c_sn' => 'a110','u_name' => 'name2','u_no' => 'b012','u_sn' => 'b2'], 1 => ['c_sn' => 'a110','u_name' => 'user name 3','u_no' => 'b012','u_sn' => 'b2'] ] ];
$data2 结果
[ 'b2' => [ 1 => ['u_sn' => 'b2','u_no' => 'b012','u_name' => 'user name 3','c_sn' => 'a110'], 0 => ['u_sn' => 'b2','u_no' => 'b012','u_name' => 'name2','c_sn' => 'a110'] ], 'b1' => [ 0 => ['u_sn' => 'b1','u_no' => 'a001','u_name' => 'name1','c_sn' => 'a110'] ] ];
filterKey()
根据允许的键过滤数组
filterKey(Array $array, $keys, $fillKey = true) : array
参数
- $array: 要比较的数组。数组
- $keys: 要比较的键列表。数组|字符串
- $fillKey: 填充数组中不存在的键,默认 true。布尔值
返回值
- 返回结果数组。
示例
$array = ['sn' => '1785','m_sn' => '40','d_sn' => '751','r_type' => 'staff','manager' => '1','s_manager' => '1','c_user' => '506']; // fill key $result = ArrayHelper::filterKey($array, ['sn', 'd_sn', 'r_type', 'manager', 'nooooooooo']); $result = ArrayHelper::filterKey($array, 'sn,d_sn, r_type, manager, nooooooooo'); // $result = ['sn' => '1785','d_sn' => '751','r_type' => 'staff','manager' => '1', 'nooooooooo' => '']; // No fill key $result = ArrayHelper::filterKey($array, ['sn', 'd_sn', 'r_type', 'manager', 'nooooooooo'], false); $result = ArrayHelper::filterKey($array, 'sn,d_sn, r_type, manager, nooooooooo', false); // $result = ['sn' => '1785','d_sn' => '751','r_type' => 'staff','manager' => '1'];