Você está na página 1de 13

Clientes Web

03. Estructura de datos: Arrays

QU SON LOS ARRAYS


Los Arrays, Arreglos o Vectores son una estructura de datos que permite almacenar informacin
en una variable especial que maneja distintos niveles de almacenamiento.
Por cada nivel, es posible almacenar distintos tipos de datos, que a su vez ocupan su propio
lugar en la memoria del programa.
Dicho de otra manera, un Array es una coleccin de variables, bajo el mismo nombre
referencial, dividido en niveles ndices.
stos ndices son en primera instancia numricos y le dicen al programa a qu nivel o
posicin del Array se hace referencia.
Por dar un ejemplo prctico, si se deseara administrar en variables los pases que forman parte
de una nmina de clientes de una empresa, podramos usar el siguiente modelo de informacin.
$pais1 = Argentina;
$pais2 = Chile;
$pais3 = Per;
$pais4 = Uruguay;

Y la lista crecera acorde a la cantidad de pases que forme parte de la lista de clientes.
Esto generara una divisin de la memoria por cada pas agregado segn el siguiente modelo:
MEMORIA:
pais1
"Argentina"

pais2
"Chile"

pais3
"Per"

pais4
"Uruguay"

La estructura de datos Array, nos propone tener un nico nombre de variable, y acceder a sus
contenidos por el nivel que corresponda:
$paises = array( ); //se usa esta funcin como constructora del array
$paises[0] = Argentina; //los corchetes en la variable le dice a qu nivel se accede
$paises[1] = Chile;
$paises[2] = Per;
$paises[3] = Uruguay;

ste modelo produce un cambio en el comportamiento de la memoria, ahora se tiene una sola
variable, que a su vez se sub-fracciona en la cantidad de niveles que correspondan:
MEMORIA:
paises
0
"Argentina"

1
"Chile"

2
"Per"

3
"Uruguay"

Cabe destacar que TODOS los arrays inician sus ndices en el valor 0.

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays

INSTANCIADO:
Los arrays son un tipo de dato en PHP que obligatoriamente necesita tener declarado su tipo
de dato al instanciarlo. No se permite asignarle un valor a una posicin de un array si no se ha
definido como tal, por lo cual el siguiente cdigo es errneo:
$alumnos[0] = Juan Prez; //segn el php.ini da error si no se defini como
array();

Si se desea, se le puede asignar contenido desde el mismo momento en que se lo declara (con
el constructor array(); ), pasndole su contenido inicial entre los corchetes, separando todos
los valores por coma, como en el ejemplo que se muestra a continuacin:
$canales = array( Telefe, Amrica, Canal 7 ,Canal 9, Fox ) ;

Una ventaja de este tipo de dato, es que permite guardar en sus distintos niveles diferentes
tipos de datos, pudiendo tener bajo el mismo nombre de variable, un booleano, un string, un
nmero y otro array (conocido arrays multidimensionales, de lo que se hablar ms tarde).
Por ejemplo:
$datos = array();
$datos[0] = Un texto;
$datos[1] = 100;
$datos[2] = true;
$datos[3] = array( cero,uno,dos ) ;

Se puede guardar una posicin de array (mucho) mayor que el nivel mximo guardado, en
cuyo caso el array se estirara hasta el nivel especificado:
$datos = array( a,b,c ) ; // la posicin mxima del array es 2
$datos[99] = estirado;

En este ejemplo, cuando se completa la posicin 99, el array pasa a tener 100 posiciones
(contando la posicin 0 como una ms). Cabe destacar que todas las posiciones del medio (de
la 3 a la 98, inclusive) son ndices o niveles fuera del rango (darn un undefined index
undefined offset si se los quiere mostrar).

MOSTRANDO LOS ARRAYS:


Para mostrar una posicin puntual del array, slo es necesario recurrir al mtodo
correspondiente de muestra (echo print) y hacer referencia a la posicin del array que se
quiere mostrar, por ejemplo:

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays

$canales = array( Telefe,Amrica,Canal 7,Canal 9,Fox ) ;


echo $canales[0] ; //muestra en pantalla Telefe
echo $canales[1] ; //muestra en pantalla Amrica
echo $canales[2] ; //muestra en pantalla Canal 7
echo $canales[3] ; //muestra en pantalla Canal 9
echo $canales[4] ; //muestra en pantalla Fox

Si por algn motivo se desea mostrar una posicin de array inexistente o vaca, el programa
mostrar la advertencia undefined offset #numero (nivel indefinido #numero).
Anexando al ejemplo anterior hacer
echo $canales[5] ; //muestra en pantalla undefined offset 5

MEJORANDO LA MUESTRA DE DATOS:


Aprovechando que los arrays poseen un ndice numrico que determina los distintos niveles de
la variable, se puede aprovechar un ciclo de repeticin de tipo FOR para recorrer y mostrar los
valores del array.
Teniendo presente que los arrays comienzan en la posicin cero, se debera hacer un ciclo que
recorra desde cero, hasta el valor mximo del array, por ejemplo:
$datos = array ( cero,uno,dos,tres ) ;
for($i = 0; $i < 4; $i++){
//voy hasta menor que 4, es decir, 3 inclusive.
echo $datos[$i] . <br /> ;
}

Dado que en cada vuelta del ciclo de repeticin la variable i va cambiando su valor, se la
aprovecha como ndice del array a mostrar, de esa manera el for realizara la siguiente
iteracin:
echo
echo
echo
echo

$datos[0]
$datos[1]
$datos[2]
$datos[3]

muestra
muestra
muestra
muestra

cero;
uno;
dos;
tres;

OPTIMIZANDO EL LMITE DEL FOR:


Teniendo presente que conforme se avance en el manejo de contenidos de la pgina web, ms
adelante no tendremos un conocimiento de la cantidad de posiciones que tiene el array (dado
que pediremos TODOS los links o fotos de una pgina, y no tendremos previo conocimiento de
la cantidad), deberemos optimizar el ciclo de repeticin pidindole al array mismo la cantidad
de posiciones que posee.
Para ello simplemente hace falta una una funcin de PHP que trabaja con el objeto array:
count( ). Esta funcin recibe entre parntesis un array y devuelve el largo del mismo, en
nuestro caso la cantidad de posiciones que posee.
Por ejemplo:

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays

$datos = array( cero,uno,dos ) ;


$cantidad = count( $datos );
echo $cantidad ; //muestra en pantalla el valor 3.

Para recorrerlo, el ciclo for empezara en cero, y se ejecutara mientras el ciclo este por debajo
del largo (sin incluirlo, sino mostrara un error de tipo undefined offset).
$datos = array( cero,uno,dos ) ;
$cantidad = count( $datos ) ;
for($i = 0; $i < $cantidad; $i++){
echo $datos[$i] . <br />;
}

DEPURANDO ERRORES Y POSICIONES UNDEFINED:


Cabe destacar que si un array fue "estirado" con una posicin mayor, dejando posiciones vacas
en el medio, hacer un count() del array devolver la cantidad de ndices activos, y no
realmente el valor ms alto:
$datos = array( cero,uno,dos ) ; //hasta ac el count() devuelve 3 posiciones.
$datos[5] = cinco; //se escribe la posicin 5, pero hay solo 4 valores ACTIVOS
$cantidad = count( $datos ) ; //devuelve 4.
for( $i = 0; $i < $cantidad; $i++ ){
echo $datos[$i] . <br /> ;
}

En este caso, el for terminar en el ndice 3 (inclusive), que se mostrar con el error
undefined offset y adems nunca pasar por el ndice 5 porque count() devolvi 4.
echo
echo
echo
echo

$datos[0]
$datos[1]
$datos[2]
$datos[3]

muestra
muestra
muestra
muestra

cero;
uno;
dos;
undefined offset 3;

ste punto se resolver ms adelante con un ciclo de repeticin PROPIO de la estructura array.

ARRAYS ASOCIATIVOS:
Una ventaja de los arrays en los lenguajes descendientes de C (javascript, action script y php
por ejemplo) es la posibilidad de usar, en lugar de ndices numricos, ndices basados en
palabras, stos se conocen como asociativos.
Por lo cual se puede tener una lista de datos en un array, pero usar en vez de nmeros,
palabras (que sean representativas).

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays
$datos = array( );
$datos[nombre] = Germn;
$datos[apellido] = Rodrguez;
$datos[edad] = 32;
$datos[email] = grodriguez@escueladavinci.net;

Al igual que con los ndices numricos, para mostrarlos, slo hace falta hacer referencia a la
posicin deseada por su ndice asociativo:
echo $datos[nombre] ; //mostrar Germn

El problema est que ya no podemos usar el ciclo de repeticin numrico, porque cuando le
digamos que me muestre el valor $datos[0] devolver undefined offset 0 ya que esa
posicin no existe.
Para ello nos queda ver un ltimo ciclo de repeticin pensado exclusivamente para arrays.

FOREACH:
Hay un ciclo de repeticin que slo trabaja con la estructura de datos Array, que nos permitir
recorrer cada posicin del array, independientemente de qu tipo de ndice posea (numrico o
asociativo).
Ese ciclo de repeticin se llama FOREACH (para cada ).
Es un ciclo de repeticin for que entre parntesis en vez de recibir los tres parmetros
normales (inicio de variable, condicin e incremento), recibe el array que va a recorrer y dos (o
tres) variables ms que representan al valor de cada posicin y su ndice.
Ejemplo:
$datos = array( );
$datos[nombre] = Germn;
$datos[apellido] = Rodrguez;
$datos[edad] = 32;
$datos[email] = grodriguez@escueladavinci.net;
foreach($datos as $valor){
echo $valor . <br /> ;
}

Lo que hace ese $datos as $valor es, en cada vuelta, pedir el valor de la posicin del array
donde est parado. Por lo cual lo que realiza el ciclo foreach es en cada vuelta el siguiente
recorrido:
//vuelta 1: $valor levanta el nombre:
echo $valor . "<br />"; $valor = $datos['nombre'] muestra Germn
//vuelta 2: $valor levanta apellido:
echo $valor . "<br />"; $valor = $datos['apellido'] muestra Rodrguez

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays
//vuelta 3: $valor levanta edad:
echo $valor . "<br />"; $valor = $datos['edad'] muestra 32
//vuelta 4: $valor levanta email:
echo $valor . "<br />"; $valor=$datos['email']muestra grodriguez@escueladavinci.net
Por ltimo, si al foreach se le indican dos variables despus del as asumir que se est pidiendo
en la primera variable el valor que se encuentra el corchete y en la segunda variable el valor
del contenido (despus del igual), para usar esta modalidad es necesario unir las dos
variables con el operador => (igual-mayor), respetando la siguiente sintaxis:
foreach( $array as $variable_del_corchete => $variable_del_valor ){ }
Por ejemplo:
$datos = array();
$datos[nombre] = Germn;
$datos[apellido] = Rodrguez;
$datos[edad] = 32;
$datos[email] = grodriguez@escueladavinci.net;
foreach(var $datos as $corchete=>$valor ){
echo $corchete . : . $valor . <br /> ; //muestro el valor del corchete y el
contenido de esa posicin
}

Este ejemplo muestra el valor del ndice de cada vuelta (en la variable $corchete) y el valor de
la posicin en cuestin (en $valor), por lo cual el foreach procesa la informacin de la siguiente
manera:
//vuelta 1: $corchete
echo $corchete . ": "
//vuelta 2: $corchete
echo $corchete . ": "
//vuelta 3: $corchete
echo $corchete . ": "
//vuelta 4: $corchete
echo $corchete . ": "

vale nombre, $valor vale $datos[nombre]:


. $valor . "<br />"; muestra nombre: Germn
vale apellido, $valor vale $datos[apellido]:
. $valor . "<br />"; muestra apellido: Rodrguez
vale edad, $valor vale $datos[edad]:
. $valor . "<br />"; muestra edad: 32
vale email, $valor vale $datos[email]:
. $valor . "<br />"; muestra email: grodriguez@escueladavinci.net

CUANDO USAR ARRAY?


En diseo web (quizs ms que en otros universos) el uso de Array como lista de datos es
FUNDAMENTAL para optimizar la dinmica de trabajo de nuestra web.
Hasta ahora se ha hablado del concepto de 'plantilla' como sectores amplios de un sitio web
(encabezado, pie de pgina, barras de navegacin, contenidos). Pero una plantilla en web,
puede ser cualquier sector que tenga una estructura compartida y slo cambien los valores a
mostrar.

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays
Bajo esta premisa, la botonera de un sitio web o los contenidos de un elemento SELECT de
formulario, tambin podran encajar en el concepto de plantilla (en definitiva los tems del
men as como las opciones del select son las mismas etiquetas y cambian slo su contenido).
Y ms an, el concepto de Array asociativo permite explotar dos valores por cada iteracin del
Array (por un lado el ndice y por otro lado el contenido).
Entonces, podramos partir de un Array asociativo que tenga en los ndices un texto a mostrar y
en sus valores las URL a navegar:
$menu = array(
home => index.php,
quienes somos => about_us.php,
contacto => contact_us.php
);

Para armar la botonera necesitaramos un ciclo foreach, para capturar tanto los ndices como
los valores de cada posicin del Array, y dentro del men reemplazar los valores con las
variables que obtienen dicha informacin:
foreach($menu as $texto => $url ){

//en cada vuelta, $texto tiene el corchete: home, quienes somos, contacto
//mientras que $url tiene los archivos: index.php, about_us.php, contact_us.php
echo ' | <a href="'.$url.'">'.$texto.'</a> | ';
}

Este ejemplo nos dara la siguiente salida:

Entonces, la misma lgica se podra aplicar a todo conjunto de datos que sea un juego de pares
(qu texto => qu contenido).
Ejemplos prcticos son opciones de formulario (select, radio, checkbox), galera de fotos (src y
alt), y dems juegos de pares del HTML.

ARRAYS MULTIDIMENSIONALES:
Los arrays, permiten guardar dentro de sus posiciones otro array. Esta prctica se conoce como
arrays multidimensionales (con ms de una dimensin) o matrices.
Para entenderlo de la manera ms simple, podramos imaginarnos una batalla naval, que tiene
un eje con la letra y otro eje con el nmero que queremos atacar, como muestra la imagen a
continuacin:

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays

En este juego, para atacar una posicin, solo hace indicar, una letra y un nmero, ejemplo:
Celda A-1.
En el caso de un array adentro de otro, la idea es la misma.
Si tengo un array formado por los siguientes datos:
$datos = array() ; //array vacio
$datos[0] = array( a,b,c ) ; //un array adentro de la posicin cero de datos
$datos[1] = array( 1,2,3 ) ; //otro array adentro de la posicin uno de datos
$datos[2] = array( i,ii,iii) ; //otro array adentro de la posicin tres de datos

Esto me genera una matriz de datos de la siguiente manera (las filas representan las posiciones
del array datos, las columnas representan los sub-arrays adentro de cada posicin de datos):
Datos | subindice
0
1
2

0
"a"
1
"i"

1
"b"
2
"ii"

2
"c"
3
"iii"

Al igual que la batalla naval, para llegar al valor "ii" necesito decirle que me muestre datos 21. Esto se realiza mediante la sucesin de corchetes por cada "nivel" al que quiero entrar, as
que ese datos 2-1 no es otra cosa que un $datos[2][1] (del array $datos, la posicin 2. Y del
array adentro de $datos[2] la posicin 1).
La nica diferencia entre una batalla naval y los arrays multidimensionales, radica en que cada
sub-array, puede tener un largo distinto al otro, por lo cual no siempre se forma una grilla
"cuadrada". Por ejemplo:
$datos = array();
$datos[0] = array( hola,chau] ;
$datos[1] = array( a,e,i,o,u);
$datos[2] = array( pepe,jose,juan) ;

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays
Esto genera un array multidimensional con la siguiente estructura:
0
1
2

'hola'
'a'
'pepe'

'chau'
'e'
'jose'

'i'
'juan'

'o'

'u'

Por lo cual, cada posicin de datos, puede tener arrays de distintos largos.
Para mostrar TODOS los valores de los arrays dentro del array datos, es necesario hacer una
rutina de for anidados (uno adentro del otro).
El primer for, recorrer el largo de datos (nos dar las posiciones 0,1,2) y luego adentro de
cada posicin hacemos otro for, que recorrer el largo de datos[primerFor] que nos dar la
cantidad de posiciones que tiene el array adentro de cada posicin de datos.
Continuemos con el array datos que se us anteriormente:
$largo = count( $datos ); //esto devuelve 3, datos[0] datos[1] datos[2]
$subLargo; //esto lo voy a usar para saber cuanto mide cada array adentro de las
posiciones de datos.
for($i = 0; $i < largo; $i++){ //recorro el array de afuera.
echo <br /><br /><b>Estamos en la posicion: . $i . de datos</b><br />); //un
dato informativo
$subLargo = count( $datos[$i] ) ; //de la posicin en la que est parado, levanto la
cantidad de posiciones.
for($j=0; $j < $subLargo; $j++){ //recorro los arrays de adentro
echo $datos[$i][$j] . <br /> ;
}
}

Esto recorre con el primer for $i, todas los niveles de datos, y por CADA nivel, con el for $j,
todas las posiciones del array dentro del nivel $datos[$i] que corresponda.

CUANDO USAR MATRICES?


Un Array multidimensional (o matriz) podra ser el paso previo a una base de datos.
Siempre que no debamos almacenar informacin suministrada por el usuario que visita nuestra
pgina que la lista de valores que generamos en un Array no deba cambiar peridicamente, el
Array es una buena prctica para liberar recursos y no conectarse a la base de datos.
Podemos mirar el concepto de matriz como un conjunto de datos agrupados por una
determinada categora o concepto.
En primera instancia puede servirnos cuando el conjunto de "pares" (ndice=>valor) nos queda
chico para la cantidad de datos que debemos manejar por cada elemento.
Imaginemos que tenemos una lista de materias, y por cada una tenemos que almacenar
nicamente el final; Tranquilamente se puede hacer con un array simple.

Prof. Germn Rodrguez grodriguez@escueladavinci.net

Clientes Web
03. Estructura de datos: Arrays

$materias = array(
Clientes Web => Sitio con backend y validacin de datos,
Programacin II => Base de datos de un sitio dinmico,
Sistemas Operativos II => Instalacin y configuracin de Servidor
Linux completo
);

Hasta ac el modelo nos sirve. Los ndices son los nombres de materia y los valores cada final.
Pero qu sucede cuando tenemos que almacenar por cada materia el primer parcial, el
segundo, el TP (si existe) y su final??
Ac no nos alcanzan los dos "espacios" que nos ofrecen el ndice y su valor.
Existen dos soluciones, la primera (menos recomendable) es tener 4 variables de tipo Array
distintas (una para todos los Parcial1, otra para todos los Parcial2, otra para todos los TPs y
una ltima para todos los finales), eventualmente se vuelve inmanejable y el programador debe
controlar "a ojo" los contenidos de cada vector para asegurarse la correlatividad de ndices
entre cada variable.
La otra opcin (ms saludable) es usar una matriz, donde por cada materia exista un sub-array
con las cuatro instancias evaluativas:
$materias = array(
Clientes Web => array(
Parcial 1 => Sitio web con arrays y funciones,
Parcial 2 => Validacin de datos con expresiones regulares,
TP => Sitio web bsico con backend,
FINAL => Sitio con backend y validacin de datos
),
Programacin II => array(
Parcial 1 => Diagrama, creacin de tablas e insercin de datos,
Parcial 2 => Consultas avanzadas y parseo de datos desde el SQL,
TP => Diagrama entidad-relacin,
FINAL=>Base de datos de un sitio dinmico
),
Sistemas Operativos II => array(
Parcial 1 => Usuarios grupos, carpetas, archivos y permisos,
Parcial 2 => Configuracin del servidor WEB y FTP,
FINAL => Instalacin y configuracin de Servidor Linux completo
)
);

Todo lo que figura en negrita son los ndices del array asociativo $materias.
Luego, por cada posicin del array de materias, existe un array con las tres instancias de
evaluacin que corresponden a esa materia.

Prof. Germn Rodrguez grodriguez@escueladavinci.net

10

Clientes Web
03. Estructura de datos: Arrays
Cabe destacar que por tener un array adentro de otro array, debemos anidar los foreach que
los recorren:
foreach($materias as $nombre_materia => $sub_array ){
echo "<h1>$nombre_materia</h1>";

//si mostramos sub-array nos dice que es un array


//debemos volver a recorrerlo con su propio foreach:
//el primer argumento del foreach ser ese sub_array
foreach( $sub_array as $que_parcial => $temas ){
echo "<strong>$que_parcial</strong>: $temas";
}
echo '<hr />' ; //solo una linea que separa materias
}

Estos dos foreach anidados, mostrarn la siguiente informacin:

FUNCIONES PARA ARRAYS


PHP tiene una cantidad enorme de funciones para trabajar con Arrays.
Las ms importantes son:
ORDENAR ARRAYS:
Podemos ordenar los contenidos de un Array ya sea por sus valores o sus ndices (en los casos
que sean asociativos).

Prof. Germn Rodrguez grodriguez@escueladavinci.net

11

Clientes Web
03. Estructura de datos: Arrays

sort: ordena en base a los valores de mayor a menor (de la A-Z) reacomodando los
ndices.
rsort: ordena en base a los valores de menor a mayor (de la Z-A) reacomodando los
ndices.
ksort: ordena en base a los ndices de mayor a menor (de la A-Z) conservando la
relacin ndice=>valor.
krsort: ordena en base a los ndices de menor a mayor (de la Z-A) conservando la
relacin ndice=>valor.

CORTAR UNA CADENA DE TEXTO EN ARRAY:


Esta funcin es importante cuando tenemos un string delimitados por algn carcter (espacios,
comas, punto y coma, pipes, etc) y queremos separar las palabras para tener en distintas
posiciones del array cada elemento separado.
Para eso se usa la funcin explode( ), que recibe como argumentos qu parmetro buscar en
el string y la cadena de texto a explotar.
El parmetro va entre comillas. Devuelve un array.
Suele ser la forma "rpida" de crear un array cuyas opciones ya sabemos de antemano:
$texto = 'Diseo Web,Diseo Multimedial,Diseo Grfico';
$carreras = explode( "," , $texto );
var_dump($carreras);

UNIR UN ARRAY EN UN STRING:


Es el paso inverso a la funcin anterior, se usa implode( )
Cuando tenemos en un array algo que queremos almacenar en un nico string, debemos hacer
al revs: pasarle un carcter que sirva como unin y el array a unir.
El parmetro para unir va entre comillas. Devuelve un string.
Siguiendo con la variable del mtodo anterior, podramos hacer en un grupo de radio buttons:
$html = array( );
foreach( $carreras as $item ){
$html[] = '<label><input type="radio" name="carrera" value="'.$item.'"
/>'.$item.'</label>';
}
$inputs = implode( '<br />', $html ); //unimos cada posicin con un <br /> en el medio
echo $inputs;

Prof. Germn Rodrguez grodriguez@escueladavinci.net

12

Clientes Web
03. Estructura de datos: Arrays

VERIFICAR CONTENIDOS:
Como desarrolladores, podemos verificar dos cosas distintas en un array.
1. Verificar si un elemento (o ndice) existe en un array. Esta funcin es VITAL para los
desarrolladores, ya que si queremos mostrar un ndice inexistente veremos un mensaje
de error del intrprete de PHP. Se usa la funcin isset( ) y recibe como argumento el
ndice al que queremos acceder (con su respectivo nombre de variable, lgicamente).
Devuelve true si existe, false si no existe.
2. Verificar si un valor existe en un array.
Se usa la funcin in_array( ) que recibe dos argumentos: Qu valor buscamos y en qu
array lo estamos buscando. Devuelve true si existe. False si no est.

Prof. Germn Rodrguez grodriguez@escueladavinci.net

13

Você também pode gostar