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).
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.
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 :
+
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.
8.7
será almacenada bajo el entero 8
.
true
será almacenada bajo el entero 1
y la clave false
bajo el entero 0
.
null
será almacenada bajo la cadena de caracteres ""
.
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) }
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) }
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 unaE_NOTICE
; A partir de PHP 8.0.0, esto emite unaE_WARNING
.
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 desdenull
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 )
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
.
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.
$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á.
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.
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.
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.
Es posible comparar varios arrays con la función array_diff() así como con los operadores 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]
?>
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);
?>
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).
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"
"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.
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 )
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.