src/Pimple/ConfigServiceProvider.php
private function mergeRecursive($existingValue, $newValue, string $path)
    {
        $existingType = gettype($existingValue);
        $newType = gettype($newValue);

        if ($existingType !== $newType) {
            throw new \LogicException(
                sprintf('Type conversion from "%s" to "%s" at path "%s"', $existingType, $newType, $path)
            );
        }

        if ('array' !== $newType) {
            return $newValue;
        }

        foreach ($newValue as $key => $newSubValue) {
            if (!is_string($key)) {
                $existingValue[] = $newSubValue;

                continue;
            }

            if (isset($existingValue[$key])) {
                $subPath = $path.'.'.$key;

                $existingValue[$key] = $this->mergeRecursive($existingValue[$key], $newSubValue, $subPath);
            } else {
                $existingValue[$key] = $newSubValue;
            }
        }

        return $existingValue;
    }
private function mergeRecursive($existingValue, $newValue, string $path)
    {
        $existingType = gettype($existingValue);
        $newType = gettype($newValue);

        if ($existingType !== $newType) {
            throw new \LogicException(
                sprintf('Type conversion from "%s" to "%s" at path "%s"', $existingType, $newType, $path)
            );
        }

        if ('array' !== $newType) {
            return $newValue;
        }

        foreach ($newValue as $key => $newSubValue) {
            if (!is_string($key)) {
                $existingValue[] = $newSubValue;

                continue;
            }

            if (isset($existingValue[$key])) {
                $subPath = $path.'.'.$key;

                $existingValue[$key] = $this->mergeRecursive($existingValue[$key], $newSubValue, $subPath);
            } else {
                $existingValue[$key] = $newSubValue;
            }
        }

        return $existingValue;
    }
private function mergeRecursive ( $ existingValue , $ newValue , string $ path ) { $ existingType = gettype ( $ existingValue ) ; $ newType = gettype ( $ newValue ) ; if ( $ existingType !== $ newType ) { throw new \ LogicException ( sprintf ( 'Type conversion from "%s" to "%s" at path "%s"' , $ existingType , $ newType , $ path ) ) ; } if ( 'array' !== $ newType ) { return $ newValue ; } foreach ( $ newValue as $ key => $ newSubValue ) { if ( ! is_string ( $ key ) ) { $ existingValue [ ] = $ newSubValue ; continue ; } if ( isset ( $ existingValue [ $ key ] ) ) { $ subPath = $ path . '.' . $ key ; $ existingValue [ $ key ] = $ this -> mergeRecursive ( $ existingValue [ $ key ] , $ newSubValue , $ subPath ) ; } else { $ existingValue [ $ key ] = $ newSubValue ; } } return $ existingValue ; }
@param array|string|float|int|bool $existingValue
@param array|string|float|int|bool $newValue
@param string                      $path

@return array|string|float|int|bool
@param array|string|float|int|bool $existingValue @param array|string|float|int|bool $newValue @param string $path