Arrays

Los arrays en PHP, como en cualquier otro lenguaje de programación, consisten en una estructura que permite almacenar un conjunto de valores bajo un mismo identificador. Como en el caso de las variables, no es necesario declarar una matriz para empezar a usarla. Tampoco es necesario reservar espacio de manera explicita; el tamaño de la matriz irá aumentando automáticamente conforme sea necesario. Entre las características más importantes de los arrays en PHP tenemos las siguientes:

  • Es posible la lectura directa de datos desde un fichero a una matriz.
  • Es posible la lectura directa de datos desde una tabla a una matriz.
  • Incorporan funciones de ordenamiento, recorrido, etc. que deben ser programadas desde cero en otros lenguajes.

En PHP existen dos formas de indexación, es decir, dos formas de especificar a qué elemento de la matriz es el que deseamos acceder.
Este hecho supone la existencia de dos tipos de arrays en PHP: arrays indexadas numéricamente y arrays indexadas asociativamente. Empezamos viendo el primer tipo.

Los **arrays indexadas numéricamente** son similares a los arrays de otros lenguajes de programación como Java o C, en los que podemos acceder a un elemento mediante un índice numérico que indica la posición del mismo dentro del array.
Para crear un array de este tipo usaremos la función _array array(mixed ...)_, que devuelve un array conteniendo todos los elementos pasados como parámetro, que como se puede observar en la especificación de la función pueden ser de diferente tipo. Por ejemplo, podríamos crear un array con el nombre de los productos de la panadería:

$productos = array ('Barras', 'Ensaimadas', 'Napolitanas');

var_dump($productos);

Resultando:

array(3) {
  [0]=>
  string(6) "Barras"
  [1]=>
  string(10) "Ensaimadas"
  [2]=>
  string(11) "Napolitanas"
}

Más adelante hablaremos más en profundidad de la funciones var_dump() y print_r() que son dos funciones que vuelcan por pantalla información sobre la variable o expresión que pasamos como parámetro.
Podemos obtener más información en estos enlaces que hacen referencia al manual de PHP: http://php.net/manual/es/function.var-dump.php
http://php.net/manual/es/function.print-r.php

Para acceder a un elemento determinado simplemente utilizaremos el nombre del array seguido de un índice numérico entre corchetes, que indica la posición del elemento dentro del array. Deberemos recordar que el primer índice en PHP siempre será el 0. Así que, por ejemplo, para acceder al segundo elemento del array _$productos_ (la cadena _'Ensaimadas'_), la sintaxis correcta sería la siguiente:

$productos[1]

En el caso en el que quisiéramos añadir un nuevo elemento a un array, podríamos hacerlo asignando directamente a la posición deseada el valor correspondiente. Por ejemplo, podemos añadir un cuarto producto a nuestra matriz de ejemplo de la siguiente forma:

$productos[3] = 'Empanadillas';

También disponemos de un forma muy interesante de agregar nuevos valores a un array que es no especificar un índice entre dos corchetes. Veamos un ejemplo:

$productos[] = 'Croasanes';

var_dump($productos);
array(5) {
  [0]=>
  string(6) "Barras"
  [1]=>
  string(10) "Ensaimadas"
  [2]=>
  string(11) "Napolitanas"
  [3]=>
  string(12) "Empanadillas"
  [4]=>
  string(9) "Croasanes"
}

Para realizar un recorrido por todos los elementos de la matriz y realizar operaciones con ellos, tenemos dos alternativas.
La primera de ella es utilizar un bucle de tipo _for_ (para ver la sintaxis de los bucles _for_ consulta los ejercicios de la sesión 2 de PHP), tal como hacemos en el siguiente ejemplo, en el que para saber cuántos elementos contiene la matriz _$productos_ utilizamos la función _count()_:

La función count devuelve el número de elementos del array si la variable pasada como parámetro lo es, un 1 si la variable no es un array, o un 0 si la variable no tiene valor.

for ($i=0; $i<count($productos); $i++)
   echo $productos[$i] . "<br />";

El segundo método para recorrer todos los elementos del array es utilizar un bucle de tipo _foreach_. Veámoslo con un ejemplo:

foreach ($productos as $valor_actual)
   echo $valor_actual . "<br />";

El bucle _foreach_ se repetirá tantas veces como elementos tenga el array _$productos_. En cada repetición se le irán asignando secuencialmente sus valores a la variable _$valor_actual_, que podrá ser utilizada en el cuerpo del bucle. Como se puede observar, en este caso no es necesario hacer referencia al índice de los elementos dentro de la matriz, ni por supuesto conocer el número de elementos que contiene.

Por último, disponemos de la posibilidad de crear una matriz a partir de un rango numérico, por medio de la función _array range(int bajo, int alto[, int paso])_, donde _bajo_ es el límite inferior del rango, _alto_ es el límite superior del rango, y _paso _ es un parámetro optativo que indica el incremento que aplicaremos para ir avanzando entre ambos límites. A continuación se muestran algunos ejemplos. En el primero de ellos se creará un array que contendrá todos los enteros entre el uno y el diez. El segundo, el array tan solo contendrá los números impares en ese rango. Por último, en el tercer ejemplo creamos un array que contiene todos los caracteres ASCII entre 'a' y 'z'.

$numeros = range(1,10);
$numeros = range(1,10,2);
$letras = range('a', 'z');

Hablemos ahora de los **arrays indexadas asociativamente**. En este tipo de arrays no accedemos a los elementos por medio de un índice numérico, sino que mediante una cadena de caracteres.
Usaremos también la función array para crearlas, aunque con una sintaxis diferente. Para cada elemento deberemos introducir la cadena con la que se indexará (la clave del elemento), seguida del símbolo =>, y finalmente el valor que almacenaremos en esa posición del array.
Por ejemplo, vamos a utilizar una matriz de este tipo para almacenar el precio de los productos de la panadería:

$precios = array('Barras' => 1,
'Ensaimadas' => 3,
'Napolitanas' => 2
);

Podemos acceder a un elemento cualquier a partir de su índice, de cualquiera de los dos modos siguientes, que son equivalentes:

$precios['Barras'] = 10;
$precios["Barras"] = 10;

De los dos métodos explicados anteriormente para recorrer todos los elementos de la matriz indexada numéricamente, el único que podemos aplicar a los arrays indexadas asociativamente es el basado en la sentencia _foreach_, ya que al no disponer de un índice numérico no podemos hacerlo mediante un bucle _for_.
Para obtener todos los precios de los productos de la panadería, por ejemplo, podríamos añadir el siguiente bucle a nuestro código, en el que en cada iteración se iría almacenando en _$clave_ el índice o clave de cada elemento de la matriz _$precios_ y en _$valor_ su correspondiente valor:

foreach ($precios as $clave => $valor)
   echo "$clave = $valor <br />";

Un método adicional para recorrer todos los elementos de la matriz hace uso de la función _each()_. Cada vez que la llamamos pasándole como parámetro un array, nos devuelve otro array con la clave indexada por las claves **0** y **key** y el valor indexado por las claves **value** y **1** del elemento actual del array.

Como veremos más adelante, cada array lleva asociado un puntero que indica el elemento siguiente a procesar. Cada vez que utilizamos la función each() devolvemos los datos del elemento apuntado actualmente por el puntero, y avanzamos el puntero una posición. El inconveniente es que en el caso de querer volver a recorrer el array es necesario restablecer el puntero a su posición inicial.

Así pues, para recorrer el array de precios podríamos usar el siguiente código:

while ($element = each($precios)) {
   echo $element['key'] . '=' . $element['value'] . '<br />';
   echo $element[0] . '=' . $element[1] . '<br />';
}

También podemos separar claves y valores en variables independientes, en lugar de tener que trabajar con un array con esos datos. En concreto, usando la función _list_ junto con _each_ haremos que la clave del elemento actual del array se almacene en la variable pasada como primer parámetro a _list_ y que el valor se almacene en la segunda variable pasada como parámetro a esa misma función:

while (list($producto,$precio) = each($precios))
   echo "$producto = $precio <br />";

results matching ""

    No results matching ""