Inserir elemento em array no PHP: uma olhada por baixo dos panos
\n\nImagine: você está escrevendo um script PHP para uma loja virtual. Chegou um novo produto e ele precisa ficar exatamente entre "Smartphones" e "Notebooks". Ou você está fazendo scraping de dados e precisa inserir uma linha no meio de um CSV. Situação familiar? A pergunta "Insert new item in array on any position in PHP" já acumulou milhares de visualizações no Stack Overflow. E não é à toa: o PHP não tem uma função nativa do tipo "insira o elemento pelo índice". Mas ele possui um conjunto de ferramentas poderoso que permite fazer isso de forma elegante e eficiente. Vamos entender como isso funciona por baixo dos panos.
\n\nPor que o PHP não tem uma função insert() simples?
\n\nAo contrário do JavaScript (que tem splice()) ou do Python (list.insert()), os arrays do PHP são um híbrido: eles são ao mesmo tempo uma lista e uma tabela hash. Quando você insere um elemento no meio, o PHP não precisa apenas deslocar ponteiros, mas sim reestruturar a estrutura de dados interna. É por isso que os desenvolvedores não adicionaram um método com o mesmo nome, mas sim uma ferramenta universal: array_splice(). Ela resolve 99% dos problemas, mas é importante entender sua lógica "interna".
A maneira mais correta: array_splice()
\n\nEste é o protagonista do nosso artigo. A função array_splice() não apenas remove parte de um array, mas também pode inserir novos elementos no lugar. E o melhor: ela faz isso sem criar um novo array — as alterações ocorrem "in place" (por referência).
<?php\n$frutas = ['maçã', 'banana', 'cereja', 'tâmara'];\n// Insere 'uva' na posição 2 (depois de 'banana')\narray_splice($frutas, 2, 0, 'uva');\nprint_r($frutas);\n// Resultado: ['maçã', 'banana', 'uva', 'cereja', 'tâmara']\n?>\n\nSintaxe: array_splice(&$array, $offset, $length, $replacement). O terceiro parâmetro ($length) é igual a zero — isso significa que não estamos removendo nada, apenas inserindo. O quarto parâmetro pode ser um único elemento ou um array de elementos.
Por baixo dos panos: Quando você chama array_splice() com comprimento zero, o PHP faz o seguinte:
- \n
- Encontra o ponteiro interno para a posição
$offset. \n - Expande o array: todos os elementos da posição até o final são deslocados para a direita. \n
- No espaço liberado, insere o novo elemento (ou elementos). \n
- Reindexa as chaves numéricas (se houver). \n
Importante: esta operação é executada em O(n) — quanto maior o array e quanto mais próxima a inserção estiver do início, mais elementos precisarão ser deslocados. Para 99% das aplicações web, isso é imperceptível, mas se você estiver trabalhando com arrays de milhões de registros, vale a pena considerar alternativas.
\n\nInserindo vários elementos
\n\nQuer inserir três elementos de uma vez? Basta passar um array:
\n\n<?php\n$cores = ['vermelho', 'verde', 'azul'];\narray_splice($cores, 1, 0, ['amarelo', 'roxo', 'laranja']);\nprint_r($cores);\n// ['vermelho', 'amarelo', 'roxo', 'laranja', 'verde', 'azul']\n?>\n\nObserve: o array de inserção não se torna aninhado — seus elementos são "desempacotados" e inseridos sequencialmente.
\n\nInserção manual: quando array_splice não é ideal
\n\nÀs vezes, você precisa manter o array original intacto. Ou quer inserir um elemento sem modificar os dados originais. É aí que entram array_slice() e uma simples cópia.
<?php\nfunction inserirNoArray(array $original, int $posicao, mixed $elemento): array\n{\n $antes = array_slice($original, 0, $posicao);\n $depois = array_slice($original, $posicao);\n return array_merge($antes, [$elemento], $depois);\n}\n\n$arr = ['a', 'b', 'c', 'd'];\n$novoArr = inserirNoArray($arr, 2, 'X');\nprint_r($novoArr); // ['a', 'b', 'X', 'c', 'd']\n// $arr permanece inalterado\n?>\n\nO que acontece por baixo dos panos? array_slice() cria dois novos arrays — isso é uma cópia