diff --git a/framework/util/ArrayHelper.php b/framework/util/ArrayHelper.php index bf94723..5039aa9 100644 --- a/framework/util/ArrayHelper.php +++ b/framework/util/ArrayHelper.php @@ -19,7 +19,7 @@ namespace yii\util; class ArrayHelper extends \yii\base\Component { /** - * Merges two arrays into one recursively. + * Merges two or more arrays into one recursively. * If each array has an element with the same string key value, the latter * will overwrite the former (different from array_merge_recursive). * Recursive merging will be conducted if both arrays have an element of array @@ -27,22 +27,27 @@ class ArrayHelper extends \yii\base\Component * For integer-keyed elements, the elements from the latter array will * be appended to the former array. * @param array $a array to be merged to - * @param array $b array to be merged from + * @param array $b array to be merged from. You can specify additional + * arrays via third argument, fourth argument etc. * @return array the merged array (the original arrays are not changed.) - * @see mergeWith */ public static function merge($a, $b) { - foreach ($b as $k => $v) { - if (is_integer($k)) { - isset($a[$k]) ? $a[] = $v : $a[$k] = $v; - } elseif (is_array($v) && isset($a[$k]) && is_array($a[$k])) { - $a[$k] = static::merge($a[$k], $v); - } else { - $a[$k] = $v; + $args = func_get_args(); + $res = array_shift($args); + while ($args !== array()) { + $next = array_shift($args); + foreach ($next as $k => $v) { + if (is_integer($k)) { + isset($res[$k]) ? $res[] = $v : $res[$k] = $v; + } elseif (is_array($v) && isset($res[$k]) && is_array($res[$k])) { + $res[$k] = self::merge($res[$k], $v); + } else { + $res[$k] = $v; + } } } - return $a; + return $res; } /**