¿Qué es mejor usar en PHP, $ matriz [] = $ valor o array_push ($ matriz, $ valor)?

113

¿Qué es mejor usar en PHP para agregar un miembro de matriz?

$array[] = $value;

o

array_push($array, $value);

?

Aunque el manual dice que es mejor evitar una llamada de función, también he leído que $array[]es mucho más lento que array_push(). ¿Cuáles son algunas aclaraciones o puntos de referencia?

alex
fuente
2
$ myArray [] = 123; Esto será más rápido que la función array_push. Agrega directamente el valor a esa matriz. La función tiene una pila separada para esas variables. y puede tener esa declaración dentro de esa función.
sganesh

Respuestas:

150

No hay puntos de referencia, pero personalmente siento que $array[]es más limpio de ver, y honestamente dividir los pelos en milisegundos es bastante irrelevante a menos que planee agregar cientos de miles de cadenas a su matriz.

Editar : ejecuté 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;

El primer método que se utiliza $array[]es casi un 50% más rápido que el segundo.

Algunos resultados de referencia:

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[]

Esto no debería sorprender, ya que el manual de PHP señala esto:

Si usa array_push () para agregar un elemento a la matriz, es mejor usar $ array [] = porque de esa manera no hay sobrecarga de llamar a una función.

Por la forma en que está redactado, no me sorprendería que array_pushsea ​​más eficiente al agregar múltiples valores. EDITAR : Por curiosidad, hice algunas pruebas adicionales, e incluso para una gran cantidad de adiciones, las $array[]llamadas individuales son más rápidas que una grande array_push. Interesante.

Paolo Bergantino
fuente
Siempre prefiero saber cuál es la forma más rápida, así que cuando llegue el día me pedirán que produzca un sitio de alto tráfico, tendré una idea. Gracias por la respuesta.
alex
10
Las microoptimizaciones como estas rara vez valen la pena. Si lo está escribiendo desde cero, hágalo como tenga más sentido, y solo entonces, si es un poco lento para producir una página, perfílelo. Las posibilidades de tener que cambiar algo como esto para acelerar las cosas son escasas.
Alister Bulman
4
Solo para asegurarme, dado que el código parece no $array[]coincidir con la salida, verifiqué que es mucho más rápido, 300 ms frente a 2000 ms para asignaciones de 1 M en mi máquina. Sin embargo, agregar 20 elementos a la vez en array_push fue tan rápido como 20 $array[] =s.
Elle
5
@AlisterBulman Las microoptimizaciones no valen la pena si estás pensando en volver a revisar todo tu código base y 'optimizarlo'. Sin embargo, si tiene varias formas diferentes de hacer lo mismo y es consciente de que una es mejor (aunque sea un poco) que las otras, puede adoptar la costumbre de utilizarla de esa forma. ¿Por qué no harías esto?
Okonomiyaki3000
2
@AlisterBulman Debo estar totalmente en desacuerdo, o al menos parcialmente, si sabe mejor, escriba mejor , pero no ponga mucho esfuerzo en buscar una posible
microoptimización
42

El uso principal de array_push () es que puede insertar varios valores al final de la matriz.

Dice en el documentación :

Si usa array_push () para agregar un elemento a la matriz, es mejor usar $ array [] = porque de esa manera no hay sobrecarga de llamar a una función.

Inspirar
fuente
29

De los documentos de php paraarray_push :

Nota: Si usa array_push () para agregar un elemento a la matriz, es mejor usar $ array [] = porque de esa manera no hay sobrecarga de llamar a una función.

Benedict Cohen
fuente
Es curioso cómo fue tu respuesta primero, pero es la menos votada.
T.Woody
21

Se dice en la calle que [] es más rápido porque no hay gastos generales para la llamada a la función. Además, a nadie le gustan las funciones de matriz de PHP ...

"¿Es ... pajar, aguja ... o es pajar de agujas ... ah, a la mierda ... [] ="

typeoneerror
fuente
7
¿Eh? Las funciones de matriz de PHP son impresionantes.
cletus
13
Funcionalmente son increíbles, sí, pero se refería al esquema de nombres inconsistente.
ryeguy
2
Debe activar las sugerencias de parámetros en su IDE. Pero estoy de acuerdo, un poco de consistencia hubiera sido genial.
Pim Jager
4
Estoy de acuerdo en esto. No hay coherencia ni en el esquema de nomenclatura (x_y o xy o y_x ...) ni en la lógica de los parámetros (pase el objeto de destino primero, último, entre matrices, cadenas y expresiones regulares, ¡buena suerte para encontrar una regla común!).
e2-e4
3
FWIW, me gusta la convención de nomenclatura de agujas / pajar y me resulta fácil de recordar, ya que va en el mismo orden que la frase: "como encontrar una aguja (1) en un pajar (2)"
rybo111
8

Una diferencia es que puede llamar a array_push () con más de dos parámetros, es decir, puede enviar más de un elemento a la vez a una matriz.

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

huellas dactilares 1,2,3,4

VolkerK
fuente
2

Una simple declaración $ myarray [] será más rápida, ya que simplemente empuja un elemento a la pila de elementos debido a la falta de sobrecarga que traería una función.

Tom Hallam
fuente
2

Dado que " array_push " es una función y se llamó varias veces cuando está dentro del bucle, asignará una memoria a la pila. Pero cuando usamos $ matriz [] = $ valor, simplemente asignamos valor a la matriz.

Vinod Kirte
fuente
1

La segunda es una llamada de función, por lo que generalmente debería ser más lenta que usar las funciones de acceso a la matriz principal. Pero creo que incluso una consulta de base de datos dentro de su script superará 1.000.000 llamadas a array_push().

Stefan Gehrig
fuente
0

Aunque la pregunta era más sobre el desempeño, la gente llegará a esta pregunta preguntándose si es una buena práctica usar array_pusho$arr[] .

La función puede significar líneas menores para múltiples valores:

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

Sin embargo , array_push...

  • no puede recibir las claves de matriz
  • rompe la aguja / pajar convención de nomenclatura de
  • es más lento, como se ha comentado

Me quedaré con $arr[].

rybo111
fuente
0

Solo quiero agregar: int array_push(...)devolver el nuevo número de elementos en la matriz ( php doc ). que puede ser útil y más compacto que $myArray[] = ...; $total = count($myArray);.

También array_push(...)es significativo cuando la variable se usa como pila.

Jean-Luc Barat
fuente