rikudou / array-merge-recursive
替换内置的 array_merge_recursive 函数,该函数不会向数组中添加值而是替换它们
v1.0.3
2021-04-22 14:29 UTC
Requires
- php: ^7.3|^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.18
- php-coveralls/php-coveralls: ^2.4
- phpstan/phpstan: ^0.12.84
- phpunit/phpunit: ^9.5
README
安装
composer require rikudou/array-merge-recursive
描述
PHP函数 array_merge_recursive
的行为有些令人困惑,并且与 array_merge
完全不同。
令人困惑的行为示例
<?php $array1 = [ 'test' => 'test' ]; $array2 = [ 'test' => 'test2' ]; $result = array_merge_recursive($array1, $array2); // $result = // array(1) { // 'test' => // array(2) { // [0] => // string(4) "test" // [1] => // string(5) "test2" // } // }
如你所见,内置函数不会替换相同的键,而是将它们合并在一起。
与常规 array_merge
相比
<?php $array1 = [ 'test' => 'test' ]; $array2 = [ 'test' => 'test2' ]; $result = array_merge($array1, $array2); // $result = // array(1) { // 'test' => // string(5) "test2" // }
array_merge
替换值以最新的值,但不适用于深层数组结构。
此库替换了 array_merge_recursive
的行为,使其像常规 array_merge
一样工作,同时保留递归合并深层数组的能力。
示例
<?php use function Rikudou\ArrayMergeRecursive\array_merge_recursive; $array1 = [ 'test' => 'test' ]; $array2 = [ 'test' => 'test2' ]; $result = array_merge_recursive($array1, $array2); // $result = // array(1) { // 'test' => // string(5) "test2" // }
深层级别数组示例
以下示例中使用这两个数组
<?php $array1 = [ 'test' => [ 'key1' => 'test', 'key2' => 'test', 'key3' => 'test' ] ]; $array2 = [ 'test' => [ 'key2' => 'test2', 'key4' => 'test2' ] ];
内置 array_merge_recursive
的结果
array(1) {
'test' =>
array(4) {
'key1' =>
string(4) "test"
'key2' =>
array(2) {
[0] =>
string(4) "test"
[1] =>
string(5) "test2"
}
'key3' =>
string(4) "test"
'key4' =>
string(5) "test2"
}
}
在这里你可以看到 key2
被更改为包含两个值数组的数组。
内置 array_merge
的结果
array(1) {
'test' =>
array(2) {
'key2' =>
string(5) "test2"
'key4' =>
string(5) "test2"
}
}
由于 array_merge
不会递归工作,它完全用第二个数组的值替换了 test
键。
此库的 array_merge_recursive
的结果
array(1) {
'test' =>
array(4) {
'key1' =>
string(4) "test"
'key2' =>
string(5) "test2"
'key3' =>
string(4) "test"
'key4' =>
string(5) "test2"
}
}
此库正确地用后续值替换了 key2
,同时保持了整个树。