Forked from KaiCMueller/array_merge_recursive_distinct.php
Created
May 24, 2022 13:11
-
-
Save zaherg/9a7ac6cab560a2d6126674c5c1bbfdd0 to your computer and use it in GitHub Desktop.
Merging two multi dimensional arrays, overwriting existing values
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* array_merge_recursive does indeed merge arrays, but it converts values with duplicate | |
* keys to arrays rather than overwriting the value in the first array with the duplicate | |
* value in the second array, as array_merge does. I.e., with array_merge_recursive, | |
* this happens (documented behavior): | |
* | |
* array_merge_recursive(array('key' => 'org value'), array('key' => 'new value')); | |
* => array('key' => array('org value', 'new value')); | |
* | |
* array_merge_recursive_distinct does not change the datatypes of the values in the arrays. | |
* Matching keys' values in the second array overwrite those in the first array, as is the | |
* case with array_merge, i.e.: | |
* | |
* array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value')); | |
* => array('key' => array('new value')); | |
* | |
* Parameters are passed by reference, though only for performance reasons. They're not | |
* altered by this function. | |
* | |
* @author Daniel <daniel (at) danielsmedegaardbuus (dot) dk> | |
* @author Gabriel Sobrinho <gabriel (dot) sobrinho (at) gmail (dot) com> | |
* | |
* @param array $array1 | |
* @param array $array2 | |
* | |
* @return array | |
*/ | |
protected function array_merge_recursive_distinct(array &$array1, array &$array2) | |
{ | |
$merged = $array1; | |
foreach ($array2 as $key => &$value) { | |
if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { | |
$merged[$key] = $this->array_merge_recursive_distinct($merged[$key], $value); | |
} else { | |
$merged[$key] = $value; | |
} | |
} | |
return $merged; | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment