Las matrices en PHP

Desde el punto de vista de la programación en PHP, nos vienen a la mente dos palabras que definen el trabajo que podemos hacer con matrices: versatilidad y facilidad. Con una amplia colección de funciones nativas de PHP, y con un sistema de trabajo que muchos lenguajes envidiarían, el trabajo con matrices es, sin duda, muy fácil y, a la vez, extremadamente potente.

Quizá una de las características que más versatilidad le da al uso de matrices es el hecho de que puedan emplear, para la identificación de los elementos, claves numéricas (asignadas por el programador o auto-incrementales) y/o asociativas teniendo incluso, en una misma matriz si fuera necesario, claves de ambos tipos. A las matrices que tienen claves asociativas se las llama, también, diccionarios.

Aunque usted ya sabe crear y manejar matrices en PHP, a lo largo de este tutorial vamos a aprender el uso de algunas funciones y técnicas interesantes que, por no ser de uso común en otros lenguajes, a menudo permanecen ignorads incluso por los webmasters más avanzados, pese a estar documentadas en el manual oficial de PHP.

La creación de matrices en PHP

Por supuesto, antes de pensar a utilizar matrices, debemos pensar en crearlas. Esto podemos hacerlo de dos formas diferentes. Usaremos una u otra según el caso y las circunstancias. Por una parte, podemos usar la instrucción array(), así:

$matriz = array("ALFA", "BETA", "GAMMA");

Esto creará una matriz con tres elementos, con claves numéricas asignadas por el intérprete (empezando, como es habitual, desde 0), tal como se ve a continuación:

$matrizClave012
ValorALFABETAGAMMA

Como ve, los valores se almacenan sin las comillas. En el código, estas deben aparecer, puesto que se trata de datos de cadena.

El otro modo de crear una matriz es, simplemente, asignando un valor a un elemento, tal como se muestra en la siguiente línea:

$matriz[] = "ALFA";

Esto creará un elemento, con el valor especificado. La clave, en este caso, es numérica y se asigna la primera clave que no exista. Es decir, si la matriz es nueva, se crea dicha matriz y se asigna, al nuevo elemento, la clave 0. Si ya existen elementos y la clave más alta que hay es, digamos, 5, se asignará la clave 6 para el nuevo elemento. Dada la posibilidad de crear una matriz de este modo, al conjunto de corchetes [] se le conoce como operador de matriz.

Observe, por ejemplo, la siguiente secuencia de instrucciones:

$matriz = array(2=>"ALFA", "claveDeBeta"=>"BETA",7=>"GAMMA");
$matriz[10] = "DELTA";
$matriz[] = "EPSILON";

Esto dará lugar a la siguiente matriz:

$matrizClave2claveDeBeta71011
ValorALFABETAGAMMADELTAEPSILON

Observe que el último elemento, cuyo valor es EPSILON, se le ha asignado, por parte del propio PHP, la siguiente clave numérica disponible, dado que, en el código, no se asigna ninguna clave de modo específico.

Dese cuenta, también, de que, al contrario de lo que ocurre en otros lenguajes, los elementos no creados no existen. Es decir, no se crean elementos «vacíos» con las claves intermedias no asignadas cuando la matriz usa claves numéricas.

Quiero llamar su atención al respecto a un par de temas importantes cuando usted trabaje con claves asociativas y numéricas. Por una parte, el reconocimiento de las claves es sensible a mayúsculas y minúsculas. Suponga las siguientes instrucciones:

$matriz["elem"] = "DELTA";
$matriz["ELEM"] = "EPSILON";

Esto crea dos elementos distintos, no actúa sobre un mismo elemento. Sin embargo, dichas claves no son sensibles al tipo de dato. Por ejemplo, suponga lo siguiente:

$matriz["1"] = "DELTA";
$matriz[1] = "EPSILON";

En la primera línea se crea un elemento al que se asigna el valor DELTA. En la segunda línea, se le asigna el valor EPSILON al mismo elemento, reemplazando al valor anterior. Esto sólo es válido si el índice asociativo va expresado con los mismos dígitos que su contraparte numérico. Por ejemplo, suponga lo siguiente:

$matriz["01"] = "DELTA";
$matriz[1] = "EPSILON";

En este caso, sí tenemos dos elementos, cada uno con su valor.

Y otra cosa. No se puede crear una matriz si el nombre que le damos está ya asignado a una variable escalar. Suponga el siguiente fragmento de código:

$x = 0;
$x[] = 20;

En principio, uno puede pensar que esto convertirá $x en una matriz, pero no es así. Al tratar de ejecutarlo, obtendremos el siguiente aviso en la página:

Warning: Cannot use a scalar value as an array in C:/Documents as Setting\Ulises\Mis documentos\Mis webs dinamicas\p1.php on line 5

Dado que, como elemento de una matriz, podemos asignarle cualquier valor escalar o compuesto, es muy fácil crear, en PHP, matrices multidimensionales (llamadas, también, matrices profundas). Suponga la siguiente línea de código:

$matriz = array("Elemento 1", array("Elemento 2A", "Elemento 2B"), "Elemento 3");

Esto creará una matriz en la que el segundo elemento (el que tiene la clave 1) es, a su vez, una matriz con dos elementos. De hecho, no todos los elementos de una matriz tienen por qué ser del mismo tipo. En $matriz hay, en este caso, dos elementos que almacenan valores escalares y un elemento que almacena un valor compuesto. A su vez, dentro de la matriz interna, podría haber más matrices, si fuera necesario, pero no suele serlo. En la mayoría de los casos, con un máximo de dos dimensiones se cubre cualquier posible necesidad de programación. La línea que acabamos de ver generará una matriz como la que aparece reflejada a continuación:

$matriz Clave 0 1 2
Valor Elemento1
Clave 0 1
Valor Elemento 2A Elemento 2B
Elemento 3

Y aquí aparece una cuestión importante. Si queremos referirnos a alguno de los elementos de $matriz que contiene un valor escalar, usaremos un índice. Por ejemplo, así:

echo $matriz[0];

Esto mostrará en la página el valor del primer elemento de la matriz. Sin embargo, no podemos usar la misma notación para ver el valor del segundo elemento, ya que este es un dato compuesto. Suponga que escribe lo siguiente:

echo $matriz[1];

En la página le aparecerá la palabra Array, indicando que lo que intentamos visualizar es, también , una matriz. En ese caso, para acceder a cada elemento individualmente deberemos usar dos índices. El primero corresponderá a la matriz que hemos declarado específicamente (en este ejemplo, $matriz). El segundo corresponderá a la matriz que podemos llamar interna o subyugada. Suponga la siguiente línea:

echo $matriz[1][0];

En la página se mostrará Elemento 2A, como cabe esperar.

Por supuesto, PHP proporciona mejores modos de ver el contenido de una matriz, sobre todo durante el proceso de depuración de scripts. Para ello, contamos con las funciones var_dump() y print_r(). Para ver cómo operan, suponga el siguiente fragmento de script (observe que el código PHP lo hemos encerrado, esta vez, entre los tags <pre> y </pre> de HTML para hacer la salida más legible para el usuario ya que, de otro modo, sale todo en una sola línea):

<pre>
<?php
$matriz = array("Elemento 1", array("Elemento 2A", "elemento 2B"), "Elemento 3");
var_dump($matriz);
?>
</pre>

Como ve, la matriz es la misma que en el caso anterior. Esto enviará a la salida estándar del navegador lo siguiente:

array(3) {
[0] =>
string(10) "Elemento 1"
[1] =>
array(2) {
[0] =>
string(11) "Elemento 2A"
[1] =>
string(11) "Elemento 2B"
}
[2] =>
string(10) "Elemento 3"
}

Como ve, aparece toda la información necesaria sobre cada elemento: clave, tipo de dato, tamaño y valor del elemento. En el caso de los datos compuestos, como es el elemento $matriz[1], se muestran los datos de cada uno de los valores escalares que incluye. Si en lugar de var_dump() usamos print_r(), la salida es algo más escueta, tal como se ve a continuación:

Array
(
[0] => Elemento 1
[1] => Array
(
[0] => Elemento 2A
[1] => Elemento 2B
)
[2] => Elemento 3
)

Esta última función admite un segundo parámetro de tipo booleano. Si no lo especificamos, el valor asumido por defecto es false. Si especificamos true, podemos mandar el resultado a una variable, en lugar de hacerlo a la salida estándar (la pantalla). La forma de hacer esto es la siguiente:

$contenido = print_r($matriz, true);

Para terminar, quiero llamar su atención acerca de un punto que, a menudo, induce a error, a pesar de lo elemental de la cuestión. Suponga el siguiente fragmento:

<pre>
<?php
define("clave", 10);
$matriz[10] = "Elemento 1";
$matriz["clave"] = "Elemento 2";
print_r($matriz);
?>
</pre>

Fíjese que aquí se declaran dos elementos de la matriz, no uno. Recuerde que PHP dispone de la característica de expansión de variables, pero no de constantes. Así pues, la salida será la siguiente:

Array
(
[10] => Elemento 1
[clave] => Elemento 2
)

Sin embargo, suponga que, en lugar de la constante clave, hubiéramos empleado la variable $clave, así:

<pre>
<?php
$clave = 10;
$matriz[10] = "Elemento 1";
$matriz["$clave"] = "Elemento 2";
print_r($matriz);
?>
</pre>

La salida, en ese caso, sería la siguiente:

Array
(
[10] => Elemento 2
)

Observe la diferencia. En este último ejemplo todo el trabajo se hace sobre un único elemento de la matriz. Por último, aclarar que la expansión de variables sólo es operativa si se usan comillas dobles, no simples. Observe la siguiente variación:

<pre>
<?php
$clave = 10;
$matriz[10] = "Elemento 1";
$matriz['$clave'] = "Elemento 2";
print_r($matriz);
?>
</pre>

El resultado será el que aparece a continuación:

Array
(
[10] => Elemento 1
[$clave] => Elemento 2
)

Comparte