La mejor manera de inicializar array (vacío) en PHP


En algunos otros lenguajes (AS3 por ejemplo), se ha observado que la inicialización de una nueva matriz es más rápida si se hace así var foo = [] en lugar de var foo = new Array() por razones de creación de objetos e instanciación. Me pregunto si hay alguna equivalencia en PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}
Author: Tom Auger, 2011-05-11

8 answers

En implementaciones ECMAScript (por ejemplo, ActionScript o JavaScript), Array() es una función constructora y [] es parte de la gramática literal del array. Ambos están optimizados y ejecutados de maneras completamente diferentes, con la gramática literal no siendo acosada por la sobrecarga de llamar a una función.

PHP, por otro lado, tiene construcciones de lenguaje que pueden parecer funciones pero no son tratadas como tales. Incluso con PHP 5.4, que soporta [] 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 soportar versiones anteriores de PHP, use la sintaxis anterior. También hay un argumento para la legibilidad, pero, siendo un desarrollador de JS desde hace mucho tiempo, esto último me parece bastante natural.  En realidad cometí el error de intentar inicializar arrays usando [] cuando estaba aprendiendo PHP por primera vez.

Este cambio al lenguaje fue propuesto originalmente y rechazado debido a una mayoría de votos en contra por los desarrolladores principales con la siguiente razón:

Este parche no será aceptado porque una ligera mayoría de los desarrolladores principales votaron en contra. Aunque si se toma una media acumulada entre los desarrolladores del núcleo y los votos de los usuarios parece mostrar lo contrario, sería irresponsable presentar un parche que no sea compatible o mantenido a largo plazo.

Sin Embargo, parece que hubo un cambio de corazón que conduce a 5.4, quizás influenciado por las implementaciones de soporte para bases de datos populares como MongoDB (que usan sintaxis ECMAScript).

 155
Author: Andy E,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-26 12:01:17
$myArray = []; 

Crea una matriz vacía.

Puede insertar valores en el array más tarde, así:

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

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

Habiendo venido de otras lenguas, esta forma de agregarse a una matriz me parecía extraña. Esperaba tener que hacer algo como my myArray + = "perro" o algo así... o tal vez un método "add ()" como Visual Basic las colecciones tienen. Pero esta sintaxis de adición directa ciertamente es corta y conveniente.

En realidad tienes que 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 anexar a una matriz es simplemente una forma de decirle a PHP que asigne los índices a cada valor automáticamente, en lugar de asignar los índices. Bajo las portadas, PHP 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 lo hace, PHP completará los números de índice que faltan, aumentando desde el número de índice más grande asignado a medida que avanza.

Así que si haces esto:

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

... el artículo "perro" recibirá un número índice de 21. PHP no hace coincidencia inteligente de patrones para asignación de índice incremental, por lo que no sabrá que podría haber querido asignar un índice de 30 a "perro". Puede utilizar otras funciones para especificar el patrón de incremento de una matriz. No voy a entrar en eso aquí, pero todo está en los documentos PHP.

Salud,

-=Cameron

 165
Author: C Landreaux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-07 22:22:15

Antes de PHP 5.4:

$myArray = array();

PHP 5.4 y superior

$myArray = [];
 43
Author: Md. Shafiqur Rahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-04 10:41:38

En PHP un array es un array; no hay consideración primitiva vs.objeto, por lo que no hay optimización comparable a tener.

 26
Author: Adrian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 15:30:48

Lo que estás haciendo es 100% correcto.

En términos de nomenclatura agradable, a menudo se hace que las propiedades privadas/protegidas estén precedidas de un guion bajo para hacer obvio que no son públicas. Por ejemplo, private $_arr = array() o public $arr = array()

 18
Author: James C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 15:31:05

No hay ninguna otra manera, así que esta es la mejor.

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

 4
Author: Matthieu Napoli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-17 16:20:38

Inicializando una matriz simple:

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

Inicializando matriz dentro de matriz:

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

Fuente: Sorce para el código

 4
Author: improgrammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-15 15:39:40

Prueba esto:

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

    // will print
    // array(0) { }
 3
Author: Pyetro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-24 13:19:20