PHP 8.3.21 Released!

Los arrays

Un array en PHP es en realidad un mapa ordenado. Un mapa es un tipo que asocia valores a claves. Este tipo está optimizado para diferentes usos; puede ser considerado como un array, una lista, una tabla hash, un diccionario, una colección, una pila, una cola y probablemente más. Se puede tener, como valor de un array, otros arrays, multidimensionales o no.

La estructura de estos datos supera el objeto de este manual, pero encontrará al menos un ejemplo para cada uno de los casos mencionados. Para más información, consulte las diferentes explicaciones sobre el tema que se encuentran en la web.

Sintaxis

Sintaxis de un array

Un array puede ser creado utilizando la estructura de lenguaje array(). Toma un número ilimitado de parámetros, cada uno separado por una coma, en forma de un par key => value.

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

La coma después del último elemento de un array es opcional y puede no ser añadida. Generalmente, esto se hace para los arrays en una sola línea, i.e. array(1, 2) es preferido a array(1, 2, ). Para los arrays en varias líneas, la coma final generalmente se utiliza, ya que permite añadir más fácilmente nuevos elementos al final.

Nota:

Existe una sintaxis de array corta que reemplaza array() por [].

Ejemplo #1 Un array simple

<?php
$array1
= array(
"foo" => "bar",
"bar" => "foo",
);

// Utilizando la sintaxis de array corta
$array2 = [
"foo" => "bar",
"bar" => "foo",
];
?>

La clave key puede ser un int, o una string. El valor value puede ser de cualquier tipo.

Además, las siguientes modificaciones de tipo ocurrirán para la clave key :

  • Las cadenas de caracteres que contienen un entero válido, a menos que el número esté precedido por un signo + serán modificadas a un tipo entero. I.e. la clave "8" será actualmente almacenada como el entero 8. Por otro lado, "08" no será modificada, sabiendo que no es un entero decimal válido.
  • Los números de punto flotante también serán modificados a entero, lo que significa que la parte después de la coma será truncada. I.e. la clave 8.7 será almacenada bajo el entero 8.
  • Los booleanos también serán modificados a entero, i.e. la clave true será almacenada bajo el entero 1 y la clave false bajo el entero 0.
  • El valor Null será modificado a una cadena vacía, i.e. la clave null será almacenada bajo la cadena de caracteres "".
  • Los arrays y los objetos no pueden ser utilizados como clave. Si se intenta, se emitirá la siguiente alerta: Illegal offset type.

Si varios elementos en la declaración de un array utilizan la misma clave, solo la última será utilizada, sobrescribiendo así todas las anteriores.

Ejemplo #2 Ejemplo sobre la modificación de tipo y la sobrescritura

<?php
$array
= array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>

El resultado del ejemplo sería:

array(1) {
  [1]=>
  string(1) "d"
}

Dado que todas las claves del ejemplo anterior son modificadas al entero 1, el valor será sobrescrito en cada nuevo elemento, y solo el último cuyo valor asignado es "d" será conservado.

Los arrays PHP pueden contener claves de tipo int y string al mismo tiempo, dado que PHP no distingue entre arrays indexados y arrays asociativos.

Ejemplo #3 Ejemplo con claves de tipo int y string

<?php
$array
= array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-
100 => 100,
);
var_dump($array);
?>

El resultado del ejemplo sería:

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

La clave key es opcional. Si no se especifica, PHP utilizará un incremento de la última clave entera utilizada.

Ejemplo #4 Arrays indexados sin clave

<?php
$array
= array("foo", "bar", "hello", "world");
var_dump($array);
?>

El resultado del ejemplo sería:

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}

Es posible especificar la clave solo para algunos elementos y no proporcionarla para otros:

Ejemplo #5 Ejemplo con claves solo para algunos elementos

<?php
$array
= array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>

El resultado del ejemplo sería:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

Como puede ver, el último valor "d" ha sido asignado a la clave 7. Esto se debe a que la última clave entera más grande utilizada anteriormente era 6.

Ejemplo #6 Ejemplo complejo sobre la modificación de tipo y la sobrescritura

Este ejemplo incluye todas las variaciones de modificación de tipo de claves y sobrescrituras de los elementos.

<?php
$array
= array(
1 => 'a',
'1' => 'b', // el valor "a" será sobrescrito por "b"
1.5 => 'c', // el valor "b" será sobrescrito por "c"
-1 => 'd',
'01' => 'e', // dado que esto no es una cadena de caracteres entera no SOBRESCRIBIRÁ la clave para 1
'1.5' => 'f', // dado que esto no es una cadena de caracteres entera no SOBRESCRIBIRÁ la clave para 1
true => 'g', // el valor "c" será sobrescrito por "g"
false => 'h',
'' => 'i',
null => 'j', // el valor "i" será sobrescrito por "j"
'k', // el valor "k" es asignado a la clave 2. Esto se debe a que la última clave entera más grande utilizada anteriormente era 1
2 => 'l', // el valor "k" será sobrescrito por "l"
);
var_dump($array);
?>

El resultado del ejemplo sería:

array(7) {
  [1]=>
  string(1) "g"
  [-1]=>
  string(1) "d"
  ["01"]=>
  string(1) "e"
  ["1.5"]=>
  string(1) "f"
  [0]=>
  string(1) "h"
  [""]=>
  string(1) "j"
  [2]=>
  string(1) "l"
}

Ejemplo #7 Ejemplo de índice negativo

Cuando se asigna una clave entera negativa n, PHP se encargará de asignar la siguiente clave a n+1.

<?php
$array
= [];

$array[-5] = 1;
$array[] = 2;

var_dump($array);
?>

El resultado del ejemplo sería:

array(2) {
  [-5]=>
  int(1)
  [-4]=>
  int(2)
}
Advertencia

Anterior a PHP 8.3.0, la asignación de una clave entera negativa n asignaba la siguiente clave a 0. El ejemplo anterior habría producido por lo tanto:

array(2) {
  [-5]=>
  int(1)
  [0]=>
  int(2)
}

Acceso a los elementos de un array utilizando la sintaxis a base de corchetes

Los elementos de un array pueden ser accedidos utilizando la sintaxis array[key].

Ejemplo #8 Acceso a los elementos de un array

<?php
$array
= array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);

var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

El resultado del ejemplo sería:

string(3) "bar"
int(24)
string(3) "foo"

Nota:

Anterior a PHP 8.0.0, los corchetes y llaves podían ser utilizados de manera intercambiable para acceder a los elementos de un array (e.g. $array[42] y $array{42} harían ambos lo mismo en el ejemplo anterior). La sintaxis con las llaves fue deprecada en PHP 7.4.0 y ya no es soportada a partir de PHP 8.0.0.

Ejemplo #9 Referencia a un array a la salida de una función o un método

<?php
function getArray() {
return array(
1, 2, 3);
}

$secondElement = getArray()[1];

var_dump($secondElement);
?>

Nota:

Un intento de acceso a una clave de un array que no ha sido definida equivale a intentar acceder a una variable no definida: se emitirá una alerta de nivel E_WARNING (E_NOTICE antes de PHP 8.0.0), y el resultado valdrá null.

Nota:

Referenciar a un array a la salida de una función o un método de un valor escalar que no es una string genera null. Anterior a PHP 7.4.0, esto no generaba ningún mensaje de error. A partir de PHP 7.4.0, esto emite una E_NOTICE; A partir de PHP 8.0.0, esto emite una E_WARNING.

Creación/modificación con corchetes

Un array existente puede ser modificado asignándole explícitamente valores.

La asignación de un valor en un array se realiza especificando la clave, entre corchetes. La clave también puede no ser especificada, en la forma: [].

$arr[clé] = valeur;
$arr[] = valeur;
// clé puede ser un int o una string
// valeur puede ser cualquier tipo

Si durante la asignación $arr no existe o está definido a null o false, será creado; es así una manera indirecta de crear un array. Esta práctica es, sin embargo, desaconsejada porque si $arr contiene ya algunos valores (i.e. string desde la variable solicitada) entonces este valor permanecerá en su lugar y [] puede esperar un operador de acceso sobre una cadena. Es siempre una mejor opción inicializar una variable por asignación directa.

Nota: A partir de PHP 7.1.0, la aplicación del operador de índice vacío sobre una cadena lanza una excepción fatal. Anteriormente, la cadena habría sido convertida silenciosamente en array.

Nota: A partir de PHP 8.1.0, crear un nuevo array a partir de false es obsoleto. Crear un nuevo array desde null y los valores indefinidos sigue estando permitido.

Para modificar un valor en particular, es conveniente asignar un valor especificando su clave. Para borrar un par clave/valor, es conveniente llamar a la función unset() sobre la clave deseada.

Ejemplo #10 Uso de los corchetes con los arrays

<?php
$arr
= array(5 => 1, 12 => 2);

$arr[] = 56; // Idéntico a $arr[13] = 56;
// en este punto del script

$arr["x"] = 42; // Esto añade un nuevo elemento al
// array con la clave "x"

var_dump($arr);

unset(
$arr[5]); // Esto borra el elemento del array

unset($arr); // Esto borra completamente el array

var_dump($arr);
?>

Nota:

Como se dijo anteriormente, si no se especifica ninguna clave, el índice máximo existente es reutilizado, y la nueva clave será ese número, más 1 (pero al menos 0). Si no existe ningún índice entero, la clave será 0 (cero).

Tenga en cuenta que la clave entera máxima para esta operación no necesita existir en el array en el momento de la manipulación. Solo debe haber existido en el array en algún momento desde la última vez que el array fue reindexado. Aquí hay un ejemplo que ilustra este principio:

<?php
// Creación de un array simple.
$array = array(1, 2, 3, 4, 5);
print_r($array);

// Ahora, eliminamos todos los elementos, pero conservamos el array:
foreach ($array as $i => $value) {
unset(
$array[$i]);
}
print_r($array);

// Añadir un elemento (note que la nueva clave es 5, y no 0).
$array[] = 6;
print_r($array);

// Reindexación:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

El resultado del ejemplo sería:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

Desestructuración de array

Los arrays pueden ser desestructurados utilizando [] (a partir de PHP 7.1.0) o list(). Estas construcciones pueden ser utilizadas para desestructurar un array en variables distintas.

Ejemplo #11 Desestructuración de array

<?php
$tableau_source
= ['foo', 'bar', 'baz'];

[
$foo, $bar, $baz] = $tableau_source;

echo
$foo, PHP_EOL; // muestra "foo"
echo $bar, PHP_EOL; // muestra "bar"
echo $baz, PHP_EOL; // muestra "baz"
?>

La desestructuración de array puede ser utilizada en un foreach para desestructurar un array multidimensional mientras se itera sobre él.

Ejemplo #12 Desestructuración de array en un foreach

<?php
$tableau_source
= [
[
1, 'John'],
[
2, 'Jane'],
];

foreach (
$tableau_source as [$id, $name]) {
echo
"{$id}: '{$name}'\n";
}
?>

Los elementos del array serán ignorados si la variable no es proporcionada. El array siempre comienza en el índice 0.

Ejemplo #13 Ignorar elementos

<?php
$tableau_source
= ['foo', 'bar', 'baz'];

// Asigna el elemento situado en el índice 2 a la variable $baz
[, , $baz] = $tableau_source;

echo
$baz; // Muestra "baz"
?>

A partir de PHP 7.1.0, los arrays asociativos también pueden ser desestructurados. Esto permite seleccionar más fácilmente el elemento correcto en los arrays indexados numéricamente, ya que el índice puede ser especificado explícitamente.

Ejemplo #14 Desestructuración de array asociativo

<?php
$tableau_source
= ['foo' => 1, 'bar' => 2, 'baz' => 3];

// Asigna el elemento situado en el índice 'baz' a la variable $three
['baz' => $three] = $tableau_source;

echo
$three, PHP_EOL; // Muestra "3"

$tableau_source = ['foo', 'bar', 'baz'];

// Asigna el elemento situado en el índice 2 a la variable $baz
[2 => $baz] = $tableau_source;

echo
$baz, PHP_EOL; // Muestra "baz"
?>

La desestructuración de array puede ser utilizada para permutar fácilmente dos variables.

Ejemplo #15 Permutar dos variables

<?php
$a
= 1;
$b = 2;

[
$b, $a] = [$a, $b];

echo
$a, PHP_EOL; // Muestra 2
echo $b, PHP_EOL; // Muestra 1
?>

Nota:

El operador de descomposición (...) no es soportado en las asignaciones.

Nota:

Un intento de acceso a una clave de un array que no ha sido definida equivale a intentar acceder a una variable no definida: se emitirá una alerta de nivel E_WARNING (E_NOTICE antes de PHP 8.0.0), y el resultado valdrá null.

Funciones útiles

Hay muchas funciones útiles para trabajar con los arrays. Se invita a leer la sección de este manual sobre las funciones en relación con los arrays.

Nota:

La función unset() permite borrar las claves de un array. Sea atento sobre el hecho de que el array no será no reindexado. Si desea realizar un borrado completo y una reindexación de su array, debe utilizar la función array_values().

Ejemplo #16 Borrar elementos intermedios

<?php
$a
= array(1 => 'one', 2 => 'two', 3 => 'three');

/* producirá un array como este
$a = array(1 => 'one', 3 => 'three');
y NO un array como este
$a = array(1 => 'one', 2 =>'three');
*/
unset($a[2]);
var_dump($a);

$b = array_values($a);
// Ahora, $b vale array(0 => 'one', 1 =>'three')
var_dump($b);
?>

La estructura de control foreach existe todo especialmente para los arrays. Proporciona una manera conveniente de recorrer un array.

Lo que es posible hacer o no con un array

¿Por qué $foo[bar] es incorrecto?

Utilice siempre comillas alrededor de un índice literal. Por ejemplo, $foo['bar'] es correcto, mientras que $foo[bar] no lo es. Pero ¿por qué? Es común encontrar este tipo de sintaxis en scripts antiguos:

<?php
$foo
[bar] = 'enemy';
echo
$foo[bar];
// etc
?>

Esto es incorrecto, pero funciona. La razón es que este código tiene una constante indefinida (bar) en lugar de una string ('bar' - note las comillas). Esto funciona porque PHP convierte automáticamente una cadena desnuda (una cadena sin comillas que no corresponde a ningún símbolo conocido) en una cadena que la contiene. Actualmente, si no hay ninguna constante llamada bar, entonces PHP sustituirá 'bar' en la cadena y la utilizará.

Advertencia

La solución de recurso que considera una constante no definida como una cadena de caracteres desnuda es un error de nivel E_NOTICE. Esto es obsoleto a partir de PHP 7.2.0, y emite un error de nivel E_WARNING. A partir de PHP 8.0.0, esto ha sido retirado y lanza una excepción Error.

Esto no significa que siempre se deban poner las claves entre comillas. No utilice comillas con las claves que son constantes o variables, ya que esto impediría que PHP las interpretara.

Ejemplo #17 Clave entre comillas

<?php
error_reporting
(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);

// Array simple:
$array = array(1, 2);
$count = count($array);

for (
$i = 0; $i < $count; $i++) {
echo
"\nVerificación de $i : \n";
echo
"Incorrecto: " . $array['$i'] . "\n";
echo
"Correcto: " . $array[$i] . "\n";
echo
"Incorrecto: {$array['$i']}\n";
echo
"Correcto: {$array[$i]}\n";
}
?>

El resultado del ejemplo sería:

Verificación de 0 :
Notice: Undefined index:  $i in /path/to/script.html on line 9
Incorrecto:
Correcto: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Incorrecto:
Correcto: 1

Verificación de 1 :
Notice: Undefined index:  $i in /path/to/script.html on line 9
Incorrecto:
Correcto: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Incorrecto:
Correcto: 2

Más ejemplos para explicar este comportamiento:

Ejemplo #18 Más ejemplos

<?php
// Mostramos todos los errores
error_reporting(E_ALL);

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// Correcto
echo $arr['fruit'], PHP_EOL; // apple
echo $arr['veggie'], PHP_EOL; // carrot

// Incorrecto. Esto funciona pero PHP emitirá un error de tipo E_NOTICE porque
// se utiliza la constante llamada fruit que está indefinida
//
// Error: Undefined constant "fruit"
try {
echo
$arr[fruit]; // apple
} catch (Error $e) {
echo
get_class($e), ': ', $e->getMessage(), PHP_EOL;
}

// Esto define una constante para explicar lo que está mal. El valor 'veggie'
// es asignado a la constante llamada fruit.
define('fruit', 'veggie');

// Notar la diferencia ahora
echo $arr['fruit'], PHP_EOL; // apple
echo $arr[fruit], PHP_EOL; // carrot

// Lo siguiente es correcto, porque está en una cadena. Las constantes no son buscadas
// en las cadenas, y por lo tanto, no se emitirá ninguna alerta E_NOTICE
echo "Hello $arr[fruit], PHP_EOL"; // Hello apple

// Con una excepción: los paréntesis alrededor de un array en una cadena permiten
// que las constantes sean interpretadas
echo "Hello {$arr[fruit]}", PHP_EOL; // Hello carrot
echo "Hello {$arr['fruit']}", PHP_EOL; // Hello apple

// La concatenación es otra solución
echo "Hello " . $arr['fruit'], PHP_EOL; // Hello apple
?>
<?php
// Esto no funcionará, y resultará en un error de análisis, como este:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Esto ocurre cuando se utiliza una superglobal en las cadenas
print "Hello $arr['fruit']";
print
"Hello $_GET['foo']";
?>

Cuando error_reporting está definido para mostrar los errores de tipo E_NOTICE (definiéndolo a E_ALL, por ejemplo), tal práctica se vuelve inmediatamente visible. Por defecto, error_reporting no está definido para mostrar todas las alertas.

Como se vio en la sección "sintaxis", lo que se encuentra entre corchetes ('[' y ']') debe ser una expresión. Esto significa que el código siguiente funciona:

<?php
echo $arr[somefunc($bar)];
?>

Este es un ejemplo de uso de una función que devuelve un valor que será la clave del array. PHP también entiende las constantes:

<?php
$error_descriptions
[E_ERROR] = "A fatal error has occurred";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";
?>

Notar que E_ERROR también es un identificador válido, al igual que bar en el primer ejemplo. Pero el último ejemplo es finalmente el mismo que este:

<?php
$error_descriptions
[1] = "A fatal error has occurred";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>

porque E_ERROR vale 1, etc.

Entonces, ¿por qué es una mala práctica?

En el futuro, los desarrolladores PHP pueden querer añadir otra constante o palabra clave, o bien una constante en otra parte del código que pueda interferir. Por ejemplo, siempre es incorrecto utilizar la palabra empty y default, sabiendo que son palabras reservadas.

Nota: Para mayor claridad, en una cadena entre comillas dobles, es válido no rodear los índices de un array con comillas, y por lo tanto, "$foo[bar]" es válido. Ver los ejemplos a continuación para más detalles, pero también la sección sobre la interpretación de variables en las cadenas.

Conversión en un array

Para todos los tipos int, float, string, bool y recurso, convertir un valor en un array resulta en un array que contiene un solo elemento cuyo índice vale cero y el valor, un valor escalar convertido. En otras palabras, (array) $scalarValue es exactamente lo mismo que array($scalarValue).

Si un objeto es convertido en un array, el resultado será un array cuyos elementos son las propiedades del objeto. Las claves son los nombres de los miembros, con una ligera excepción: las variables que tienen un nombre en forma de entero son inaccesibles; las variables privadas tendrán el nombre de la clase añadido al nombre de la variable; las variables protegidas tendrán un '*' añadido al nombre de la variable. Estos valores prefijados tienen bytes NUL en ambos lados. Las propiedades tipadas no inicializadas son silenciosamente desechadas.

Ejemplo #19 Conversión en array

<?php
class A {
private
$B;
protected
$C;
public
$D;
function
__construct()
{
$this->{1} = null;
}
}
var_export((array) new A());
?>

El resultado del ejemplo sería:

array (
  '' . "\0" . 'A' . "\0" . 'B' => NULL,
  '' . "\0" . '*' . "\0" . 'C' => NULL,
  'D' => NULL,
  1 => NULL,
)

Estos bytes NUL pueden llevar a resultados inesperados:

Ejemplo #20 Conversión de un objeto en array

<?php

class A {
private
$A; // Esto se convierte en '\0A\0A'
}

class
B extends A {
private
$A; // Esto se convierte en '\0B\0A'
public $AA; // Esto se convierte en 'AA'
}

var_dump((array) new B());
?>

El resultado del ejemplo sería:

array(3) {
  ["BA"]=>
  NULL
  ["AA"]=>
  NULL
  ["AA"]=>
  NULL
}

Aquí, se podría pensar que hay 2 claves llamadas 'AA', mientras que una está actualmente llamada '\0A\0A'.

La conversión de null en un array resulta en un array vacío.

Comparación

Es posible comparar varios arrays con la función array_diff() así como con los operadores de arrays.

Desempaquetado de arrays

Un array precedido por ... será desempaquetado en su lugar durante la definición del array. Solo los arrays y los objetos que implementan Traversable pueden ser desempaquetados. El desempaquetado de array con ... está disponible a partir de PHP 7.4.0.

Es posible desempaquetar varias veces, y añadir elementos normales antes y después del operador ...:

Ejemplo #21 Desempaquetado simple de array

<?php
// Utilización de la sintaxis de array corta.
// Funciona con array() también.
$arr2 = [...$arr1]; // [1, 2, 3]
$arr3 = [0, ...$arr1]; // [0, 1, 2, 3]
$arr4 = [...$arr1, ...$arr2, 111]; // [1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; // [1, 2, 3, 1, 2, 3]

function getArr() {
return [
'a', 'b'];
}
$arr6 = [...getArr(), 'c' => 'd']; // ['a', 'b', 'c' => 'd']

var_dump($arr1, $arr2, $arr3, $arr4, $arr5, $arr6);
?>

Desempaquetar un array con el operador ... sigue las semánticas de la función array_merge(). Es decir, que las claves posteriores sobrescriben los valores anteriores y las claves numéricas son renumeradas:

Ejemplo #22 Desempaquetado de array con clave duplicada

<?php
// string key
$arr1 = ["a" => 1];
$arr2 = ["a" => 2];
$arr3 = ["a" => 0, ...$arr1, ...$arr2];
var_dump($arr3); // ["a" => 2]

// integer key
$arr4 = [1, 2, 3];
$arr5 = [4, 5, 6];
$arr6 = [...$arr4, ...$arr5];
var_dump($arr6); // [1, 2, 3, 4, 5, 6]
// Which is [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6]
// where the original integer keys have not been retained.
?>

Nota:

Las claves que no son ni enteros ni cadenas lanzan una TypeError. Tales claves solo pueden ser generadas por un objeto Traversable.

Nota:

Anterior a PHP 8.1, el desempaquetado de array que tenía una clave en forma de cadena no era soportado:

<?php

$arr1
= [1, 2, 3];
$arr2 = ['a' => 4];
$arr3 = [...$arr1, ...$arr2];
// Fatal error: Uncaught Error: Cannot unpack array with string keys in example.php:5

$arr4 = [1, 2, 3];
$arr5 = [4, 5];
$arr6 = [...$arr4, ...$arr5]; // funciona. [1, 2, 3, 4, 5]
?>

Ejemplos

El tipo array en PHP es realmente versátil. Aquí hay algunos ejemplos:

Ejemplo #23 Versatilidad de un array

<?php
// Esto
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // la clave será 0
);

$b = array('a', 'b', 'c');

var_dump($a, $b);

// es estrictamente equivalente a
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // la clave será 0

$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';

// Después de la ejecución del código anterior, $a será el array
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), y $b será el array
// array(0 => 'a', 1 => 'b', 2 => 'c'), o simplemente array('a', 'b', 'c').
var_dump($a, $b);
?>

Ejemplo #24 Uso de array()

<?php
// Array como mapa de propiedades
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
var_dump($map);

// claves numéricas estrictas
// es idéntico a array(0 => 7, 1 => 8, ...)
$array = array( 7,
8,
0,
156,
-
10
);
var_dump($array);

$switching = array( 10, // clave = 0
5 => 6,
3 => 7,
'a' => 4,
11, // clave = 6 (el índice entero máximo es 5)
'8' => 2, // clave = 8 (entero!)
'02' => 77, // clave = '02'
0 => 12 // el valor 10 será sobrescrito por el valor 12
);
var_dump($switching);

// array vacío
$empty = array();
var_dump($empty);
?>

Ejemplo #25 Colección

<?php
$colors
= array('rojo', 'azul', 'verde', 'amarillo');

foreach (
$colors as $color) {
echo
"¿Le gusta el color $color ?\n";
}

?>

El resultado del ejemplo sería:

¿Le gusta el color rojo ?
¿Le gusta el color azul ?
¿Le gusta el color verde ?
¿Le gusta el color amarillo ?

La modificación directa de valores de un array es posible pasándolo por referencia.

Ejemplo #26 Modificación de un elemento en el bucle

<?php
foreach ($colors as &$color) {
$color = mb_strtoupper($color);
}
unset(
$color); /* Nos aseguramos de que las escrituras posteriores
sobre $color no modifiquen el último elemento del array */

print_r($colors);
?>

El resultado del ejemplo sería:

Array
(
    [0] => ROJO
    [1] => AZUL
    [2] => VERDE
    [3] => AMARILLO
)

Este ejemplo crea un array, cuya indexación comienza en 1.

Ejemplo #27 Indexación comenzando en 1

<?php
$firstquarter
= array(1 => 'Enero', 'Febrero', 'Marzo');
print_r($firstquarter);
?>

El resultado del ejemplo sería:

Array
(
    [1] => Enero
    [2] => Febrero
    [3] => Marzo
)

Ejemplo #28 Llenado de un array

<?php
// Llena un array con todos los elementos de un directorio
$handle = opendir('.');
while (
false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
var_dump($files);
?>

Los arrays están ordenados. El orden puede ser modificado utilizando varias funciones. Vea la sección sobre las funciones sobre los arrays para más información. La función count() puede ser utilizada para contar el número de elementos de un array.

Ejemplo #29 Ordenación de un array

<?php
sort
($files);
print_r($files);
?>

Dado que el valor de un array puede ser cualquier cosa, también puede ser otro array. Esto permite la creación de arrays recursivos y arrays multidimensionales.

Ejemplo #30 Arrays recursivos y multidimensionales

<?php
$fruits
= array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third"
)
);
var_dump($fruits);

// Algunos ejemplos para encontrar los valores en el array anterior
echo $fruits["holes"][5]; // muestra "second"
echo $fruits["fruits"]["a"]; // muestra "orange"
unset($fruits["holes"][0]); // borra "first"

// Creación de un array multidimensional
$juices["apple"]["green"] = "good";
var_dump($juices);
?>

La asignación de un array implica siempre la copia de los valores. Utilice el operador de referencia para copiar un array por referencia.

Ejemplo #31 Copiar arrays

<?php
$arr1
= array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 es modificado,
// $arr1 sigue valiendo array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // ahora, $arr1 y $arr3 son idénticos

var_dump($arr1, $arr2, $arr3);
?>
add a note

User Contributed Notes 5 notes

up
128
mlvljr
13 years ago
please note that when arrays are copied, the "reference status" of their members is preserved (http://www.php.net/manual/en/language.references.whatdo.php).
up
74
thomas tulinsky
9 years ago
I think your first, main example is needlessly confusing, very confusing to newbies:

$array = array(
"foo" => "bar",
"bar" => "foo",
);

It should be removed.

For newbies:
An array index can be any string value, even a value that is also a value in the array.
The value of array["foo"] is "bar".
The value of array["bar"] is "foo"

The following expressions are both true:
$array["foo"] == "bar"
$array["bar"] == "foo"
up
59
ken underscore yap atsign email dot com
17 years ago
"If you convert a NULL value to an array, you get an empty array."

This turns out to be a useful property. Say you have a search function that returns an array of values on success or NULL if nothing found.

<?php $values = search(...); ?>

Now you want to merge the array with another array. What do we do if $values is NULL? No problem:

<?php $combined = array_merge((array)$values, $other); ?>

Voila.
up
55
jeff splat codedread splot com
20 years ago
Beware that if you're using strings as indices in the $_POST array, that periods are transformed into underscores:

<html>
<body>
<?php
printf
("POST: "); print_r($_POST); printf("<br/>");
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="Windows3.1" value="Sux">
<input type="submit" value="Click" />
</form>
</body>
</html>

Once you click on the button, the page displays the following:

POST: Array ( [Windows3_1] => Sux )
up
37
chris at ocportal dot com
11 years ago
Note that array value buckets are reference-safe, even through serialization.

<?php
$x
='initial';
$test=array('A'=>&$x,'B'=>&$x);
$test=unserialize(serialize($test));
$test['A']='changed';
echo
$test['B']; // Outputs "changed"
?>

This can be useful in some cases, for example saving RAM within complex structures.
To Top