La mejor manera de inicializar una matriz (vacía) en PHP

297

En ciertos otros idiomas (AS3, por ejemplo), se ha observado que la inicialización de una nueva matriz es más rápida si se hace de esta manera, en var foo = []lugar de var foo = new Array()por razones de creación de objetos y creación de instancias. Me pregunto si hay equivalencias en PHP.

class Foo {
    private $arr = array(); // is there another / better way?
}
Tom Auger
fuente
11
Eso es todo lo que hago.
Mateo
2
Gracias a todos los que respondieron (¡y tan rápido!). Tuve que seleccionar arbitrariamente una respuesta, por lo que Andy parecía ser la más profunda.
Tom Auger
1
Esta pregunta ayuda mucho
Hitesh
intentar array_fill? php.net/manual/en/function.array-fill.php
zx1986
2
@ zx1986 es una forma bastante engorrosa de crear una matriz vacía. Ciertamente menos que el OP $arr = array()o$arr = []
Tom Auger

Respuestas:

189

En las implementaciones de ECMAScript (por ejemplo, ActionScript o JavaScript), Array()es una función constructora y []forma parte de la gramática literal de la matriz. Ambos están optimizados y ejecutados de maneras completamente diferentes, con la gramática literal que no se ve afectada por la sobrecarga de llamar a una función.

PHP, por otro lado, tiene construcciones de lenguaje que pueden parecer funciones pero que no se tratan como tales. Incluso con PHP 5.4, que admite []como alternativa, no hay diferencia en la sobrecarga porque, en lo que respecta al compilador / analizador, son completamente sinónimos.

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

Si necesita admitir versiones anteriores de PHP, use la sintaxis anterior. También hay un argumento a favor de la legibilidad, pero, siendo un desarrollador JS desde hace mucho tiempo, este último me parece bastante natural. De hecho, cometí el error de intentar inicializar matrices usando []cuando estaba aprendiendo PHP por primera vez.

Este cambio al lenguaje fue originalmente propuesto y rechazado debido a un voto mayoritario en contra de los desarrolladores principales con la siguiente razón:

Este parche no será aceptado porque la mayoría de los desarrolladores principales votaron en contra. Aunque si toma una media acumulada entre los desarrolladores principales y los votos de los usuarios, parece ser lo contrario, sería irresponsable enviar un parche que a largo plazo no se admite ni se mantiene.

Sin embargo, parece que hubo un cambio de corazón que condujo a 5.4, tal vez influenciado por las implementaciones de soporte para bases de datos populares como MongoDB (que usan la sintaxis ECMAScript).

Andy E
fuente
51
Posiblemente el cambio 5.4 se hizo porque las personas que podían deletrear "cuál" se hizo cargo del proceso de votación :)
Rob Grant
40
Prefiero $array = [];ya que hace que ir y venir entre JS y PHP sea más fácil.
Justin
Entonces, ¿es la $array = []; mejor opción? o debería probar con otro. cuál es mejor
Hitesh
2
@hitesh: es una cuestión de preferencia personal. Ambos son exactamente iguales, []es un poco más fácil de escribir.
Andy E
77
La sintaxis [] parece ser universalmente preferida, pero es importante tener en cuenta que hay una gran cantidad de hosts que todavía usan 5.3 exclusivamente. Si desea distribuir su código, la sintaxis [] será fatal.
etc
204
$myArray = []; 

Crea una matriz vacía.

Puede insertar valores en la matriz más tarde, así:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

En este punto, $ myArray contiene "árbol", "casa" y "perro". Cada uno de los comandos anteriores se agrega a la matriz, conservando los elementos que ya estaban allí.

Habiendo venido de otros idiomas, esta forma de agregar a una matriz me pareció extraña. Esperaba tener que hacer algo como $ myArray + = "dog" o algo así ... o tal vez un método "add ()" como las colecciones de Visual Basic. Pero esta sintaxis de adición directa ciertamente es corta y conveniente.

En realidad, debe usar la función unset () para eliminar elementos:

unset($myArray[1]); 

... eliminaría "house" de la matriz (las matrices están basadas en cero).

unset($myArray); 

... destruiría toda la matriz.

Para ser claros, la sintaxis de corchetes vacíos para agregar a una matriz es simplemente una forma de decirle a PHP que asigne los índices a cada valor automáticamente, en lugar de que USTED asigne los índices. Debajo de las cubiertas, PHP realmente está haciendo esto:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

Puede asignar índices usted mismo si lo desea, y puede usar los números que desee. También puede asignar números de índice a algunos elementos y no a otros. Si hace eso, PHP completará los números de índice que faltan, incrementándose a partir del número de índice más grande asignado a medida que avanza.

Entonces, si haces esto:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

... el elemento "perro" recibirá un número de índice de 21. PHP no realiza una coincidencia inteligente de patrones para la asignación de índice incremental, por lo que no sabrá que es posible que desee asignar un índice de 30 a "perro" ". Puede usar otras funciones para especificar el patrón de incremento para una matriz. No voy a entrar en eso aquí, pero todo está en los documentos PHP.

Salud,

- = Cameron

C Landreaux
fuente
66
Es importante tener en cuenta que $ ary = [] solo funciona después de PHP 5.4. Desde una perspectiva de rendimiento, sin embargo, no hay ventaja en [] frente a array ().
Tom Auger
1
Para versiones anteriores, puede usar array_push () w3schools.com/php/func_array_push.asp No sé si hay un golpe de rendimiento asociado con esto.
Marcar el
3
Usted entendió mal el punto de @ TomAuger @Mark. $array[] = 'foo'funciona bien en versiones anteriores de PHP. Es solo $array = [];para inicializar una matriz que es nueva en 5.4.
Codemonkey
Para ser justos, esto en realidad responde a la pregunta del OP.
Smitty
jajaja ... Mente alucinada. Décadas de PHP y estoy aprendiendo que no necesita array_push.
Bangkokian
61

Antes de PHP 5.4:

$myArray = array();

PHP 5.4 y superior

$myArray = [];
MD Shafiqur Rahman
fuente
¿Y cómo podemos hacer una matriz multidimensional usando PHP 5.4 o superior?
Siraj Alam
26

En PHP, una matriz es una matriz; no hay una consideración primitiva frente a un objeto, por lo que no hay una optimización comparable.

Adrian
fuente
1
La mejor respuesta de la OMI: hay diferentes sintaxis, pero con respecto a las actuaciones, todas son iguales.
Matthieu Napoli
1
¿Hay algún problema de rendimiento involucrado para ambos? ¿Dónde puedo verificar esto? ... cualquier enlace o documento
Hitesh
2
Como resultado, hasta que esté seguro de que su código nunca se ejecutará en entornos pre 5.4, use $ array = new array ()
Tom Auger
20

Lo que estás haciendo es 100% correcto.

En términos de nombres agradables, a menudo se hace que las propiedades privadas / protegidas estén precedidas por un guión bajo para que sea obvio que no son públicas. Por ejemplo private $_arr = array()opublic $arr = array()

James C
fuente
2
En php, creo que es mejor no nombrarlos con un guión bajo ya que siempre se usa $thispara obtener el valor y nunca se deben usar propiedades públicas.
meze
1
@meze tendrías acceso a ellos como $this->arry $this->_arr. ¿Por qué nunca deberías usar propiedades públicas?
James C
5

Prueba esto:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }
Pyetro
fuente
44
Un poco genial, pero más como un truco de fiesta que un patrón de codificación realmente útil, ¿no te parece?
Tom Auger
Podría ser útil si desea crear su matriz en un objeto con patrón de propiedades y convertirla en matriz al final.
Jomar Sevillejo
4

No hay otra manera , así que este es el mejor.

Editar: Esta respuesta no es válida desde PHP 5.4 y superior.

Matthieu Napoli
fuente
Este ya no es el caso, 5.4 introdujo la sintaxis abreviada para las matrices.
Andy E
13
@Motes ¿Por qué tanto odio? '(Bromas aparte, lo he hecho más explícito al "golpear" la respuesta anterior. Todavía podría ser útil para un novato entender que la respuesta ha cambiado.
Matthieu Napoli
@Motes Las personas pierden la ganancia de repetición de la respuesta cuando la eliminan. Es mejor editarlo.
mbomb007
4

Inicializando una matriz simple:

<?php $array1=array(10,20,30,40,50); ?>

Inicializando la matriz dentro de la matriz:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

Fuente: Sorce para el código

improgramador
fuente
3
La pregunta original era sobre cómo inicializar una matriz vacía .
Tom Auger