rikudou / array-merge-recursive
Replacement of built-in array_merge_recursive function that doesn't add values to array but replaces them
Installs: 48 563
Dependents: 1
Suggesters: 0
Security: 0
Stars: 7
Watchers: 2
Forks: 0
Open Issues: 0
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
Installation
composer require rikudou/array-merge-recursive
Description
The php function array_merge_recursive
behaves a little confusingly and not at all like
array_merge
.
Example of confusing behavior:
<?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" // } // }
As you can see, the built in function doesn't replace the same keys but instead merges them together.
Compared to regular array_merge
:
<?php $array1 = [ 'test' => 'test' ]; $array2 = [ 'test' => 'test2' ]; $result = array_merge($array1, $array2); // $result = // array(1) { // 'test' => // string(5) "test2" // }
The array_merge
replaces the values with whatever comes
latest but doesn't work for deep array structures.
This library replaces the array_merge_recursive
behavior to work
like regular array_merge
while maintaining the ability
to merge deep arrays recursively.
Example:
<?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" // }
Deeper level array example
These two arrays are used in the following example:
<?php $array1 = [ 'test' => [ 'key1' => 'test', 'key2' => 'test', 'key3' => 'test' ] ]; $array2 = [ 'test' => [ 'key2' => 'test2', 'key4' => 'test2' ] ];
Result of built-in 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"
}
}
Here you can see that key2
gets changed to array with both values
added.
Result of built-in array_merge
array(1) {
'test' =>
array(2) {
'key2' =>
string(5) "test2"
'key4' =>
string(5) "test2"
}
}
Since array_merge
doesn't work recursively it completely replaces
the test
key with value from 2nd array.
Result of array_merge_recursive
from this library
array(1) {
'test' =>
array(4) {
'key1' =>
string(4) "test"
'key2' =>
string(5) "test2"
'key3' =>
string(4) "test"
'key4' =>
string(5) "test2"
}
}
This library correctly replaces the key2
with later value
while keeping the whole tree.