graze / array-merger
使用自定义值选择器递归合并数组
Requires
- php: ^5.5 | ^7.0
Requires (Dev)
- graze/standards: ^2.0
- phpunit/phpunit: ^4.8.36 | ^5.7.21 | ^6 | ^7
- squizlabs/php_codesniffer: ^3.0
This package is auto-updated.
Last update: 2024-09-24 04:49:22 UTC
README
Array Merger 允许您递归合并数组,并选择如何合并值。
为什么
PHP 函数:array_merge_recursive
确实会合并数组,但它会将具有重复键的值转换为数组,而不是像 array_merge 那样用第二个数组中的重复值覆盖第一个数组中的值。即,使用 array_merge_recursive,会发生以下情况(已记录的行为)。
$a = ['key' => 'org value', 'key2' => 'first']; $b = ['key' => 'new value', 'key2' => null]; array_merge_recursive($a, $b); // ['key' => ['org value', 'new value'], 'key2' => ['first', null]];
还有一个 array_replace_recursive
,它会用第二个数组中的值替换第一个数组中的值,但它以不同的方式处理值数组,并且只支持用最后一个值替换。
array_replace_recursive($a, $b); // ['key' => 'new value', 'key2' => null];
这个库为您提供了灵活性,以确保在合并时获得您真正想要的值。
RecursiveArrayMerger::lastNonNull($a, $b); // ['key' => 'new value', 'key2' => 'first']);
安装
通过 Composer
composer require graze/array-merger
值合并器
- LastValue:取最后一个值(默认)等同于
array_replace_recursive
- LastNonNullValue:取最后一个值,除非它是 null,那么取第一个
- FirstValue:取第一个值
- FirstNonNullValue:取第一个值,除非它是 null,那么取第二个
- RandomValue:取一个随机值
- SumValue:如果两个值都是数字,则将它们相加
- ProductValue:如果两个值都是数字,则将它们相乘
- BothValues:将两个值作为数组返回,等同于
array_merge_recursive
用法
有一个 ArrayMerger
,它只会在顶层合并,还有一个 RecursiveArrayMerger
,它将递归合并。
合并器可以接受任意数量的参数,并将第一个参数视为要合并后续数组的基数组。
$merger = new Graze\ArrayMerger\ArrayMerger(); $merger->merge( ['a' => 'first', 'b' => ['c' => 'cake', 'd' => 'fish']], ['a' => 'second', 'b' => ['d' => 'money']] ); // ['a' => 'second', 'b' => ['d' => 'money']] $merger = new Graze\ArrayMerger\RecursiveArrayMerger(); $merger->merge( ['a' => 'first', 'b' => ['c' => 'cake', 'd' => 'fish']], ['a' => 'second', 'b' => ['d' => 'money']], ['a' => 'third', 'b' => ['e' => 'planets']], ); // ['a' => 'third', 'b' => ['c' => 'cake', 'd' => 'money', 'e' => 'planets]]
提供值合并器
默认情况下,合并时会使用最后一个值,但是您可以使用不同的 值合并器 来更改合并值的行为。
$merger = new Graze\ArrayMerger\RecursiveArrayMerger(new LastNonNullValue()); $merger->merge( ['a' => 'first', 'b' => ['c' => 'cake', 'd' => 'fish']], ['a' => 'second', 'b' => ['d' => null]] ); // ['a' => 'second', 'b' => ['c' => 'cake', 'd' => 'fish']]
值合并器是一个 callable
,可以接受两个参数。这允许您使用内置和内联函数。
$merger = new Graze\ArrayMerger\RecursiveArrayMerger('max'); $merger->merge( ['a' => 1, 'b' => ['c' => 2, 'd' => 3]], ['a' => 4, 'b' => ['d' => 1]] ); // ['a' => 4, 'b' => ['c' => 2, 'd' => 3]] // or some strange value choose of your choice $merger = new Graze\ArrayMerger\RecursiveArrayMerger( function ($a, $b) { return $a % $b == 0 ? $a : $b; } ); $merger->merge( ['a' => 1, 'b' => ['c' => 2, 'd' => 3]], ['a' => 4, 'b' => ['d' => 1]] ); // ['a' => 1, 'b' => ['c' => 2, 'd' => 0]]
静态调用
您可以通过静态调用合并并指定您选择的值合并器
RecursiveArrayMerger::mergeUsing( new LastValue(), ['a' => 'first', 'b' => ['c' => 'cake', 'd' => 'fish']], ['a' => 'second', 'b' => ['d' => 'money']] ); // ['a' => 'second', 'b' => ['c' => 'cake', 'd' => 'money']]
每个提供的值合并器都有静态辅助方法来调用它们
RecursiveArrayMerger::lastNonNull( ['a' => 'first', 'b' => ['c' => 'cake', 'd' => 'fish']], ['a' => null, 'b' => ['d' => 'money']] ); // ['a' => 'first', 'b' => ['c' => 'cake', 'd' => 'money']]
值数组
默认情况下,值数组(未提供索引的数组)将被附加到一起。如果您想将它们视为关联数组,您可以提供此标志:RecursiveArrayMerger::FLAG_MERGE_VALUE_ARRAY
。
$a = ['a' => 'first', 'b' => ['a','c','d']]; $b = ['a' => 'second', 'b' => ['e']]; $merger = new Graze\ArrayMerger\RecursiveArrayMerger(new LastValue()); $merger->merge($a,$b); // ['a' => 'second', 'b' => ['a','c','d','e']] $merger = new Graze\ArrayMerger\RecursiveArrayMerger(new LastValue(), RecursiveArrayMerger::FLAG_MERGE_VALUE_ARRAY); $merger->merge($a,$b); // ['a' => 'second', 'b' => ['e','c','d']]
唯一值
默认情况下,当我们将值数组附加到一起时,它将保留重复的值。如果您想删除重复的值,您可以提供此标志:RecursiveArrayMerger::FLAG_UNIQUE_VALUE_ARRAY
。此标志仅在未提供 RecursiveArrayMerger::FLAG_MERGE_VALUE_ARRAY
标志时才相关。
$a = ['a' => 'first', 'b' => ['a','c','d']]; $b = ['a' => 'second', 'b' => ['d','e']]; $merger = new Graze\ArrayMerger\RecursiveArrayMerger(new LastValue()); $merger->merge($a,$b); // ['a' => 'second', 'b' => ['a','c','d','d','e']] $merger = new Graze\ArrayMerger\RecursiveArrayMerger(new LastValue(), RecursiveArrayMerger::FLAG_UNIQUE_VALUE_ARRAY); $merger->merge($a,$b); // ['a' => 'second', 'b' => ['a','c','d','e']]
测试
make build test
贡献
有关详细信息,请参阅 CONTRIBUTING。
安全
如果您发现任何与安全相关的问题,请通过电子邮件发送至 security@graze.com,而不是使用问题跟踪器。
致谢
许可协议
MIT 许可协议 (MIT)。有关更多信息,请参阅许可文件。