Inserção de elemento em array PHP em qualquer posição: como funciona por baixo dos panos
Você já se deparou com uma situação em que precisa inserir um novo elemento não no final, mas exatamente no meio do array? Por exemplo, adicionar um usuário no meio de uma lista em ordem alfabética ou inserir um banner publicitário entre o segundo e o terceiro post de um blog. Em PHP, essa é uma daquelas tarefas que parecem triviais, mas, quando examinadas de perto, revelam todo um mundo de mecânica interna da linguagem.
A pergunta «Insert new item in array on any position in PHP» é um verdadeiro sucesso no Stack Overflow. Milhares de desenvolvedores buscam a resposta, e não é à toa. Neste artigo, não vamos apenas mostrar a solução pronta, mas vamos olhar por baixo dos panos: o que acontece na memória, por que array_splice é o rei e quando é melhor usar outras abordagens. Vamos nessa!
Definição do problema: o que significa «inserir em qualquer posição»?
Imagine que temos um array com nomes:
$users = ['Alice', 'Bob', 'Charlie', 'David'];Queremos inserir o nome «Eve» depois de Bob, para obter:
['Alice', 'Bob', 'Eve', 'Charlie', 'David']Parece simples, não? Mas as funções padrão array_push e $array[] = só conseguem adicionar elementos no final. E array_unshift só no início. Para o meio, precisamos de outra coisa.
Solução nº1: array_splice — o canivete suíço dos arrays
A principal ferramenta para inserir um elemento em um array PHP em qualquer posição é a função array_splice. Vamos ver como ela funciona na prática.
<?php$fruits = ['apple', 'banana', 'cherry', 'date'];array_splice($fruits, 2, 0, 'blueberry');print_r($fruits);?>Resultado:
Array( [0] => apple [1] => banana [2] => blueberry [3] => cherry [4] => date)Vamos analisar os parâmetros de array_splice:
- $array — array original (passado por referência, ou seja, modificado no local).
- offset — posição onde inserir (no nosso exemplo, 2 é o índice onde o novo elemento será colocado, e os antigos serão deslocados para a direita).
- length — quantidade de elementos a serem removidos. Se for 0, não removemos nada — apenas inserimos.
- replacement — o próprio novo elemento (ou um array de elementos).
Esta é uma solução elegante que cobre 99% dos casos. Mas o que acontece «por baixo dos panos»?
Como array_splice funciona internamente: a mecânica do deslocamento
Quando você chama array_splice($array, 2, 0, $value), o PHP executa várias etapas:
- Cálculo do deslocamento: se o offset for negativo, ele é contado a partir do final do array.
- Deslocamento dos elementos: todos os elementos a partir da posição offset são deslocados para a direita pela quantidade de elementos inseridos. Esta é uma operação O(n) — quanto maior o array, mais demorada.
- Inserção: o novo elemento é colocado no espaço liberado.
- Reindexação: se o array era indexado por números, o PHP recalcula as chaves para que fiquem em ordem.
É importante entender: arrays em PHP não são listas simples, mas sim tabelas hash (ordered hash maps). Portanto, inserir no meio exige movimento físico dos elementos na memória, o que impacta o desempenho. Para arrays pequenos (até cem elementos), isso é imperceptível, mas para arrays com milhões de registros, pode se tornar um gargalo.
Solução nº2: array_splice com vários elementos
E se precisar inserir vários elementos de uma vez? O array_splice também lida com isso:
<?php$numbers = [1, 2, 5, 6];array_splice($numbers, 2, 0, [3, 4]);print_r($numb