¿Es necesario declarar una matriz PHP antes de agregar valores con []?

81
$arr = array(); // is this line needed?
$arr[] = 5;

Sé que funciona sin la primera línea, pero a menudo se incluye en la práctica.

¿Cuál es la razón? ¿Es inseguro sin él?

Sé que también puedes hacer esto:

 $arr = array(5);

pero estoy hablando de casos en los que es necesario agregar elementos uno por uno.

Ryanve
fuente
2
A menos que le gusten los avisos sobre variables no declaradas, recomendaría inicializar. Además, solo hace que el código sea legible (está claro $foo = array()que no era una cadena convertida en una matriz, etc.).
Brad Christie
6
@Brad Christie: Excepto que eso no activa ese aviso.
BoltClock
3
@BoltClock: Depende de la versión en la que esté trabajando .
Brad Christie

Respuestas:

92

Si no declara una nueva matriz y los datos que crean / actualizan la matriz fallan por cualquier motivo, cualquier código futuro que intente usar la matriz lo hará E_FATALporque la matriz no existe.

Por ejemplo, foreach()arrojará un error si la matriz no se declaró y no se le agregaron valores. Sin embargo, no se producirán errores si la matriz está simplemente vacía, como sería el caso si la hubiera declarado.

djdy
fuente
Voto a favor porque el foreachejemplo y el hecho de que se active un error aparentemente dependen de la versión de PHP que esté ejecutando.
Charles Sprayberry
1
No entiendo esa respuesta. No declarado y no agregado algo significa que no escribí en el código fuente.
Gordon
2
@Gordon, ejemplo de algo que no funcionará bien si $ algo no es igual a 1: if ($ algo == 1) {$ filas [] = "a"; $ filas [] = "b"; } foreach ($ filas como $ fila) {} El error podría haberse evitado si $ filas se hubieran declarado como $ filas = matriz (); antes de que ocurriera la declaración if.
djdy
1
Estoy de acuerdo (voté a favor) pero la vida es demasiado corta para declarar todo, todo el tiempo, aunque sabemos que es lo "correcto". Alternativamente, supongo que puede usar is_array () si le preocupan las matrices no declaradas. Como la mayoría de las cosas, depende de los detalles.
PJ Brunet
24

Solo quería señalar que la documentación de PHP enarrays realidad habla de esto en la documentación.

Desde el sitio PHP, con el fragmento de código adjunto:

$arr[key] = value;
$arr[] = value;
// key may be an integer or string
// value may be any value of any type

"Si $arraún no existe, se creará, por lo que también es una forma alternativa de crear una matriz".

Pero, como indicaron las otras respuestas ... realmente debería declarar un valor para sus variables porque todo tipo de cosas malas pueden suceder si no lo hace.

Charles Sprayberry
fuente
15

Php es un lenguaje de escritura flexible. Es perfectamente aceptable. Dicho esto, los programadores reales siempre declaran sus vars.

AlienWebguy
fuente
1
@Gordon exactamente lo que estaba pensando;)
AlienWebguy
6

¡Piense en los codificadores que vienen después de usted! Si solo ve $arr[] = 5, no tiene idea de lo que $arrpodría ser sin leer todo el código anterior en el alcance. La $arr = array()línea explícita lo deja claro.

Rob Agar
fuente
1
En PHP 5.4.x - 5.6.x: $ arr = [] también funciona.
Anthony Rutledge
4

es solo una buena práctica. Digamos que estaba agregando a su matriz dentro de un ciclo (práctica bastante común), pero luego accediendo a la matriz fuera de dicho ciclo. Sin una declaración de matriz, su código arrojaría errores si nunca ingresó al ciclo.

Julien
fuente
3

Recomiendo encarecidamente declarar la matriz antes de agregar valores. Además de todo lo mencionado anteriormente, si la matriz está dentro de un bucle, es posible que involuntariamente introduzca elementos en su matriz. Acabo de observar que esto crea un error costoso.

//Example code    
foreach ($mailboxes as $mailbox){
       //loop creating email list to get
       foreach ($emails as $email){
          $arr[] = $email;
       }
       //loop to get emails
       foreach ($arr as $email){
       //oops now we're getting other peoples emails
       //in other mailboxes because we didn't initialize the array
       }
}
ykay dice Reincorporar a Monica
fuente
¿No hagas qué?
Ryanve
1

No declarar una matriz antes de usarla puede causar problemas. Una experiencia que acabo de encontrar, llamé a este script de prueba así: indextest.php? File = 1STLSPGTGUS Esto funciona como se esperaba.

//indextest.php?file=1STLSPGTGUS
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");// should give: "Notice: Undefined index: file"
print ("file = " . $file);// should give: "Notice: Undefined index: file"

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing
file['iamempty'] =

Notice: Undefined index: file in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 14
file['file'] =

Notice: Array to string conversion in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 15
file = Array
*/

Ahora solo necesitaré un archivo, de otro script que compré, en la parte superior del mío y podemos ver cómo los valores son completamente incorrectos para el arreglo $ archivo mientras que el arreglo $ ruta está bien: "checkgroup.php" es el culpable.

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = o
file['otherthing'] = o
file['iamempty'] = o
file['file'] = o
file = oSTLSPGTGUS
*/

Inicializando la matriz antes, ¡no hay problema!

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");

$path = array();
$file = array();

$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing.php
file['iamempty'] =
file['file'] =
file = Array
*/

Así es como me di cuenta de lo importante que es inicializar variables, ya que nunca sabemos con qué problema podríamos terminar más tarde, y solo por querer ahorrar tiempo podríamos terminar perdiendo aún más al final. Espero que esto sea útil para aquellos que como yo no somos profesionales.

Dan Bon
fuente
1

Pregunta anterior, pero comparto esto, ya que este es un caso de uso en el que el código es más simple si las matrices no se declaran.

Supongamos que tiene una lista de objetos que necesita indexar en una de sus propiedades.

// $list is array of objects, all having $key property.
$index = [];
foreach ($list as $item)
    $index[$item->key][] = $item; // Dont care if $index[$item->key] already exists or not.
jaisson
fuente
0

Depende de su comprobación de errores. Si tiene informes de errores estrictos, se le dará un aviso, pero técnicamente debería funcionar sin él.

Brenjt
fuente
0

Es bueno en caso de que lo necesite como una variable global o desee reutilizar la misma matriz una y otra vez en diferentes funciones

Vinit
fuente
0

Este es tu codigo

$var[]  = 2;
print_r($var)

¡Funciona bien! hasta que alguien declare el mismo nombre de variable antes de su código encantador

$var = 3; 

$var[]  = 2;
print_r($var)

Advertencia: no se puede utilizar un valor escalar como matriz

¡Ups!

Este es un caso posible (a veces impredecible), por lo que $var = array()se necesita sí

$var = 3;
$var = array();
$var[]  = 2;
print_r($var)

Salida

Array
(
    [0] => 2
)
Lluvia
fuente
-1

De acuerdo con @djdy, solo una alternativa que me encantaría publicar:

<?php

// Passed array is empty, so we'll never have $items variable available.
foreach (array() AS $item)
    $items[] = $item;

isset($items) OR $items = array(); // Declare $items variable if it doesn't exist

?>
Otar
fuente
¿Qué sentido tiene todo esto? Parece mucho ruido y pocas nueces.
BoltClock
En lugar de declarar previamente la variable $ items, comprobará la existencia de un bucle, eso es todo.
Otar