O que é melhor para usar em PHP, $ array [] = $ value ou array_push ($ array, $ value)?

113

O que é melhor para usar em PHP para anexar um membro da matriz,

$array[] = $value;

ou

array_push($array, $value);

?

Embora o manual diga que é melhor evitar uma chamada de função, também li que $array[]é muito mais lento do que array_push(). Quais são alguns esclarecimentos ou referências?

alex
fonte
2
$ meuArray [] = 123; Isso será mais rápido do que a função array_push. Ele adiciona o valor diretamente a essa matriz. A função tem uma pilha separada para essas variáveis. e pode ter essa instrução dentro dessa função.
sganesh

Respostas:

150

Sem benchmarks, mas pessoalmente sinto que $array[]é mais limpo de se olhar e, honestamente, dividir fios de cabelo em milissegundos é bastante irrelevante, a menos que você planeje acrescentar centenas de milhares de strings ao seu array.

Editar : executou este código:

$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

O primeiro método usado $array[]é quase 50% mais rápido do que o segundo.

Alguns resultados de benchmark:

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

Isso não deve ser surpreendente, pois o manual do PHP observa o seguinte:

Se você usar array_push () para adicionar um elemento ao array, é melhor usar $ array [] = porque dessa forma não há sobrecarga de chamar uma função.

Da forma como está formulado, eu não ficaria surpreso se array_pushfosse mais eficiente ao adicionar vários valores. EDIT : Por curiosidade, fiz mais alguns testes e, mesmo para uma grande quantidade de adições, as $array[]chamadas individuais são mais rápidas do que uma grande array_push. Interessante.

Paolo Bergantino
fonte
Eu sempre prefiro saber qual é o caminho mais rápido para que, quando chegar o dia, eu seja solicitado a produzir um site de alto tráfego, terei algumas dicas. Obrigado pela resposta.
alex de
10
Micro-otimizações como essas raramente valem o esforço. Se você está escrevendo do zero, faça como faz mais sentido e só então, se for um pouco lento para produzir uma página, faça o perfil dela. As chances de ter que mudar algo assim para acelerar as coisas são mínimas.
Alister Bulman
4
Só para ter certeza, uma vez que o código parece não corresponder à saída, verifiquei que $array[]é realmente muito mais rápido, 300 ms vs. 2000 ms para atribuições de 1 milhão em minha máquina. No entanto, adicionar 20 itens de uma vez em array_push demorava cerca de 20 $array[] =s.
Elle
5
@AlisterBulman Micro-otimizações não valem o esforço se você está pensando em voltar por toda a sua base de código e 'otimizá-la'. No entanto, se você tem várias maneiras diferentes de fazer a mesma coisa e está ciente de que uma maneira é melhor (mesmo que um pouco) do que as outras, você pode criar o hábito de usar essa maneira. Por que você não faria isso?
Okonomiyaki3000 de
2
@AlisterBulman Devo discordar veementemente, ou pelo menos parcialmente, se você sabe melhor, escreva melhor , mas não se esforce muito para procurar uma possível micro-otimização ...
jave.web
42

O principal uso de array_push () é que você pode colocar vários valores no final do array.

Diz na documentação :

Se você usar array_push () para adicionar um elemento ao array, é melhor usar $ array [] = porque dessa forma não há sobrecarga de chamar uma função.

Inspirar
fonte
29

Dos documentos php paraarray_push :

Nota: Se você usar array_push () para adicionar um elemento ao array, é melhor usar $ array [] = porque dessa forma não há overhead de chamar uma função.

Benedict Cohen
fonte
Engraçado como sua resposta foi a primeira, mas é a menos votada.
T.Woody
21

A palavra corrente é que [] é mais rápido porque não há sobrecarga para a chamada de função. Além disso, ninguém gosta realmente das funções de array do PHP ...

"É ... palheiro, agulha .... ou é agulha palheiro ... ah, f *** isso ... [] ="

typeoneerror
fonte
7
Hã? As funções de array do PHP são fantásticas.
cletus
13
Funcionalmente, eles são incríveis, sim, mas ele estava se referindo ao esquema de nomenclatura inconsistente.
ryeguy
2
Você deve ativar a sugestão de parâmetro em seu IDE. Mas concordo, alguma consistência teria sido ótima.
Pim Jager
4
Eu concordo com isso. Não há consistência nem no esquema de nomenclatura (x_y ou xy ou y_x ...) nem na lógica dos parâmetros (passe o objeto de destino primeiro, por último, entre arrays, strings e regexps, boa sorte para encontrar uma regra comum!).
e2-e4
3
FWIW, eu gosto da convenção de nomenclatura agulha / palheiro e acho que é fácil de lembrar, pois segue na mesma ordem que a frase: "como encontrar uma agulha (1) em um palheiro (2)"
rybo111
8

Uma diferença é que você pode chamar array_push () com mais de dois parâmetros, ou seja, você pode enviar mais de um elemento por vez para um array.

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

estampas 1,2,3,4

VolkerK
fonte
2

Uma declaração $ myarray [] simples será mais rápida, pois você está apenas colocando um item na pilha de itens devido à falta de overhead que uma função traria.

Tom Hallam
fonte
2

Como " array_push " é uma função e é chamada várias vezes quando está dentro do loop, ela aloca uma memória na pilha. Mas quando estamos usando $ array [] = $ value, apenas atribuímos valor ao array.

Vinod Kirte
fonte
1

O segundo é uma chamada de função, então geralmente deve ser mais lenta do que usar os recursos de acesso à matriz principal. Mas acho que até mesmo uma consulta ao banco de dados em seu script superará 1.000.000 de chamadas para array_push().

Stefan Gehrig
fonte
0

Embora a questão seja mais sobre desempenho, as pessoas se perguntarão se é uma boa prática usar array_pushou $arr[].

A função pode significar linhas menores para vários valores:

// 1 line:
array_push($arr, "Bob", "Steve");
// versus 2 lines:
$arr[] = "Bob";
$arr[] = "Steve";

No entanto , array_push...

  • não pode receber as chaves do array
  • quebra a convenção de nomenclatura agulha / palheiro
  • é mais lento, como foi discutido

Eu vou continuar $arr[].

rybo111
fonte
0

Eu só quero adicionar: int array_push(...)retornar o novo número de elementos no array ( php doc ). que pode ser útil e mais compacto do que$myArray[] = ...; $total = count($myArray); .

Também array_push(...)é significativo quando a variável é usada como pilha.

Jean-Luc Barat
fonte