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));