Not as concrete as the answer of Artefacto, but based in his suggestion of using array_slice(), I wrote the next function:

    function arrayInsert($target, $byKey, $byOffset, $valuesToInsert, $afterKey) {
    	if (isset($byKey)) {
    		if (is_numeric($byKey)) $byKey = (int)floor($byKey);
    		$offset = 0;
    		
    		foreach ($target as $key => $value) {
    			if ($key === $byKey) break;
    			$offset++;
    		}
    		
    		if ($afterKey) $offset++;
    	} else {
    		$offset = $byOffset;
    	}
    	
    	$targetLength = count($target);
    	$targetA = array_slice($target, 0, $offset, true);
    	$targetB = array_slice($target, $offset, $targetLength, true);
    	return $targetA + $valuesToInsert + $targetB;
    }

Features:

 - Inserting one or mĂșltiple values
 - Inserting key value pair(s)
 - Inserting before/after the key, or by offset
 

Usage examples:

    $target = [
    	'banana' => 12,
    	'potatoe' => 6,
    	'watermelon' => 8,
    	'apple' => 7,
    	2 => 21,
    	'pear' => 6
    ];
    
    // Values must be nested in an array
    $insertValues = [
    	'orange' => 0,
    	'lemon' => 3,
        3
    ];
    
    // By key
    // Third parameter is not applicable
    //     Insert after 2 (before 'pear')
    var_dump(arrayInsert($target, 2, null, $valuesToInsert, true));
    //     Insert before 'watermelon'
    var_dump(arrayInsert($target, 'watermelon', null, $valuesToInsert, false)); 
    
    // By offset
    // Second and last parameter are not applicable
    //     Insert in position 2 (zero based i.e. before 'watermelon')
    var_dump(arrayInsert($target, null, 2, $valuesToInsert, null));