graze/array-merger

使用自定义值选择器递归合并数组

0.2 2018-09-12 14:12 UTC

This package is auto-updated.

Last update: 2024-09-24 04:49:22 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

Array Merger 允许您递归合并数组,并选择如何合并值。

Merge

为什么

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)。有关更多信息,请参阅许可文件