array_push($arr, $value) adiciona um valor ao fim de um array. Para um único valor, o atalho $arr[] = $value; faz o mesmo trabalho sem chamar função e é o que a maior parte do código PHP usa. Os dois alteram o array no lugar.
array_push() recebe o array por referência, então modifica a variável que você passa. Ele retorna o novo número de elementos, que você pode ignorar.
array_push ou $arr[] =
Use $arr[] = $value para um valor: é mais curto e evita uma chamada de função, o que faz diferença dentro de um loop grande. Use array_push() quando tiver vários valores para adicionar numa instrução, ou uma lista de valores para espalhar.
$arr[] = também funciona numa variável que ainda não existe: o PHP cria o array. O array_push() precisa de um array existente: numa variável indefinida ele lança TypeError: array_push(): Argument #1 ($array) must be of type array, null given.
Adicionar uma chave e um valor
O array_push() só acrescenta valores com a próxima chave inteira. Para adicionar uma chave com nome, atribua a ela. Para adicionar vários pares de uma vez, use += (mantém as chaves existentes) ou array_merge() (deixa os novos valores vencerem).
A diferença entre + e array_merge() quando as chaves colidem está na página sobre array_merge.
Adicionar no início: array_unshift
array_unshift($arr, $value) insere no começo. As chaves inteiras são renumeradas para que o novo valor receba o índice 0; chaves string continuam como estão. Como o array_push(), ele aceita vários valores e retorna a nova contagem.
Para colocar um par com nome primeiro, monte um novo array: $menu = ['login' => '/login'] + $menu;.
Inserir numa posição específica
array_splice($arr, $offset, 0, $values) insere sem remover nada: começa em $offset, remove 0 elementos e coloca os novos valores ali. As chaves inteiras depois do ponto de inserção são renumeradas.
O array_splice() também pode remover e substituir elementos; a página sobre remover elementos mostra essas formas.
Acrescentar outro array
array_push($a, $b) adiciona $b como um único elemento aninhado, o que raramente é o que você quer. Para adicionar os valores de $b um por um, espalhe-os, ou monte um novo array com a sintaxe spread ou array_merge().
Erro comum: atribuir o valor de retorno
O array_push() retorna um número, a nova contagem de elementos. Atribuir isso de volta à variável do array substitui o seu array por um inteiro, e o próximo array_push() nele lança um TypeError.
O mesmo vale para array_unshift() e para sort(), que retorna true. Funções que alteram um array no lugar devolvem um status, não o array.
Perguntas frequentes
Qual a diferença entre array_push e $arr[] no PHP?
Os dois acrescentam no fim. $arr[] = $x; adiciona um valor sem chamar função, então é a escolha comum e um pouco mais rápida. array_push($arr, $a, $b, $c) é prático quando você adiciona vários valores de uma vez, e retorna a nova contagem de elementos.
Como adiciono uma chave e um valor a um array no PHP?
Atribua à chave: $arr['color'] = 'blue';. O array_push() não faz isso porque sempre usa a próxima chave inteira. Para adicionar vários pares de uma vez, use $arr += ['a' => 1, 'b' => 2]; ou array_merge().
Como adiciono um elemento no início de um array no PHP?
Use array_unshift($arr, $value). Ele renumera as chaves inteiras para que o novo valor receba o índice 0; chaves string continuam como estão.
Por que meu array vira um número depois do array_push?
Porque o array_push() retorna o novo número de elementos, não o array. Escrever $arr = array_push($arr, 'x'); substitui o array por esse número. Chame-o numa linha sozinho: array_push($arr, 'x');.