ecom-6030 capÍtulo 3 using arrays prof. nelliud d. torres © - derechos reservados
TRANSCRIPT
ECOM-6030CAPÍTULO 3
USING ARRAYS
Prof. Nelliud D. Torres© - Derechos Reservados
CONTENIDO
• ARREGLOS NUMÉRICOS INDEXADOS• ARREGLOS NO-NUMÉRICOS INDEXADOS• OPERADORES DE ARREGLOS• ARREGLOS MULTIDIMENSIONALES• ORGANIZAR ARREGLOS (SORT)• FUNCIONES DE ARREGLOS
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 2
ARREGLOS• Es una variable que almacena una secuencia de
valores.• Multidimensional array – Son arreglos que
contienen otros arreglos.• PHP maneja arreglos numéricamente indexados
y asociativos.• Los arreglos asociativos manejan palabras en
lugar de números.• En este capítulo incorporamos arreglos al
laboratorio que estamos trabajando.8/12/2007 © - Derechos Reservados - Prof. Nelliud D.
Torres 3
Pag. 79
SCALAR VARIABLES• Una variable ‘scalar’ es una localización en
memoria con strings (en lugar de número) en el cual se almacena un solo valor.
• El concepto es similar al nombre de un arreglo en donde se almacenan valores.
• El siguiente diagrama muestra como se almacenarían en un arreglo los productos que se utilizan en la fórmula.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 4
Pag. 80
Tires Oil Spark Plugs
product
DIAGRAMA DE ARREGLOS
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 5
Pag. 80
Array elements0
1
2
3
4
Valor 1
Valor 2
Valor 3
Valor 4
Valor 5Associated index, key osuscrito
Se pueden utilizar números o caracteres (string) para el associated index
Árreglo
CREANDO ARREGLOS• Podemos crear un suscrito con sus datos de la siguiente
manera:$productos = array( ‘Tires’, ‘Oil’, ‘Spark Plugs’ );
• Para crear un arreglo con rango numérico del 1 al 10 usamos la siguiente directiva:
$numeros = range(1,10);
• Para crear una lista con valores impares:$impares = range(1,10,2);
• También se puede crear la lista con letras:$letras = range(‘a’, ‘z’);
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 6
Pag. 81
ACCEDIENDO CONTENIDO DE ARREGLOS• Para acceder el contenido de un arreglo, utilizamos su
nombre.• Si la variable es un arreglo se accede el contenido
utilizando el nombre de la variable y el suscrito, key o índice.
• El índice se pone entre brackets. El siguiente ejemplo muestra el contenido del arreglo llamado products.(Tires, Oil y Spark Plugs)
$products[0], $products[1], $products[2]
• En PHP como en C, el primer índice comienza en cero.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 7
Pag. 81
TRABAJANDO CONTENIDO DE ARREGLOS• Para cambiar el contenido de un arreglo:$products[0] = ‘Fuses’;
• Para incluir un nuevo elemento.$products[3] = ‘Fuses’;
• Para mostrar el contenido de un arreglo:echo “$products[0] $products[1] $products[2] $products[3]”
• El siguiente ejemplo crea el mismo arreglo sin la necesidad de definirlo primero:
$products[0] = ‘Tires’;
$products[1] = ‘Oil ’;
$products[2] = ‘Spark Plugs’;
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 8
Pag. 82
Si products no existe, se crea un arreglo de un elemento y los demás se van incluyendo dinámicamente
USO DE CICLOS PARA ACCEDER EL ARREGLO• Como un arreglo es indexado por una secuencia de
números, se puede utilizar la instrucción for para mostrar su contenido. Ejemplo:
for ( $i = 0; $i<3; $i++)
echo “$products[$i]”;
• También se puede utilizar la instrucción foreach.foreach ($products as $current)
echo $current.’ ‘;
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 9
Pag. 82
Muestra los elementos separados por un espacio en blanco en la misma línea
USO DE ÍNDICES• PHP permite manejar arreglos en los que se puede
asociar cualquier suscrito con cada valor. Ejemplo:$prices = array(‘Tires’=>100, ‘Oil’=>10, ‘Spark Plugs’=>4 );
• En el ejemplo anterior se crea el arreglo utilizando de índices los nombres de los productos y como elemento el precio de cada uno. Otros ejemplos que crean el mismo arreglo son:
$prices = array(‘Tires’=>100);
$prices[‘Oil’] = 10;
$prices[‘Spark Plugs’] = 4;
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 10
Pag. 83
$prices[‘Tires’] = 100;$prices[‘Oil’] = 10;$prices[‘Spark Plugs’] = 4;
CICLOS CON AREGLOS DE ÍNDICE NO NUMÉRICO
• Al utilizar arreglos con índices no numéricos, no se puede utilizar la instrucción for, sino eachfor. Ejemplo:
foreach ($prices as $key => $value)
echo $key.’=>’.$value.’<br />’;
• Otro ejemplo que mostraría el arreglo es:
while( $element = each( $prices ))
{
echo $element[ ‘key’ ];
echo ‘-‘;
echo $element[ ‘value’ ];
echo ‘<br /> ‘;
}
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 11
Pag. 83-84
each es un construct que crea las variables key y value automáticamente.
CICLOS CON AREGLOS DE ÍNDICE NO NUMÉRICO (CONT.)
• Otra forma más elegante y común de crear el mismo ciclo anterior es con el contructor list: Ejemplo:
list( $product, $price) = each( $prices );
• El ciclo while quedaría así:
while( list( $product, $price ) = each( $prices ))
{
echo “$product - $price‘<br /> ‘;
}
Si se desea recorrer el arreglo nuevamente, se utiliza la instrucción reset. Ej: reset($prices);
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 12
Pag. 84-85
Las variables $product y $price son creadas y se pueden utilizar dentro del ciclo.
OPERADORES DE ARREGLOSOPERADOR NOMBRE EJEMPLO RESULTADO
+ Union $a + $b El arreglo $b se añade (append) al arreglo $a.
== Equality $a == $b Devuelve cierto si los elementos de $a son iguales a los elementos de $b.
=== Identity $a === $bDevuelve cierto si los elementos de $a son iguales a los elementos de $b y en el mismo orden.
!= Inequality $a != $b Cierto si $a y $b no contienen los mismos elementos
<> Inequality $a <> $b Igual que el anterior.
!== Non-identity $a !== $b Cierto si no contienen los mismos elementos en el mismo orden.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres
13Pag. 85
ARREGLOS EN DOS DIMENSIONALES• Un arreglo puede componerse a su vez de arreglos y por
lo tanto crear un arreglo de dos dimensiones.
• Para crear el arreglo anterior se utilizan las siguientes instrucciones:
$products = array( array( ‘TIR’, ‘Tires’, 100 ),
array( ‘OIL’, ‘Oil’, 10 ),
array( ‘SPK’, ‘Spark Plugs’, 4 ));
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 14
Pag. 86
Código Descripción Precio
TIR Tires 100
OIL Oil 10
SPK Spark Plugs 4
ARREGLOS BIDIMENSIONALES (CONT.)• Para mostrar el contenido del arreglo multidimensional se pueden
usar estas instrucciones.echo ‘|’.$products[0][0].’|’.$products[0][1].’|’ .$products[0][2].’|<br />’;
echo ‘|’.$products[1][0].’|’.$products[1][1].’|’ .$products[1][2].’|<br />’;
echo ‘|’.$products[2][0].’|’.$products[2][1].’|’ .$products[2][2].’|<br />’;
• O con el siguiente ciclo for:for ( $row = 0; $row < 3; $row++)
{
for ($column = 0; $column < 3, $column++ )
{
echo ‘|’.$products[$row][$column];
}
echo ‘|<br />’;
}
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 15
Pag. 87
ARREGLOS BIDIMENSIONALES CON NOMBRES - CREACIÓN
• Si deseamos crear un arreglo multidimensional y hacer referencia por nombre, escribimos lo siguiente:
$products = array( array ‘Code’ => ‘TIR’,
‘Description’=> ‘Tires’,
‘Price’ => 100
), array ‘Code’ => ‘OIL’,
‘Description’=> ‘Oil’,
‘Price’ => 10
), array ‘Code’ => ‘SPK’,
‘Description’=> ‘Spark Plugs’,
‘Price’ => 4
) );
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 16
Pag. 87-88
ARREGLOS BIDIMENSIONALES CON NOMBRES - CICLO
• Si deseamos recorrer el arreglo multidimensional, el código sería:
for ( $row = 0; $row < 3; $row++ ){
echo ‘|’.$products[$row][‘Code’].’|’ .$products[$row][‘Description’].’|’ .$products[$row][‘Price’].’|<br />’;
• Utilizando las funciones each() y list() se puede crear el siguiente ciclo. Ojo-note que se necesita un ciclo while.
for ( $row = 0; $row < 3; $row++ ){
while ( list( $key, $value ) = each( $products[ $row ])){
echo “|$value”;}echo ‘|<br />’;
}
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 17
Pag. 87-88
ARREGLOS MULTIDIMENSIONALES• Un arreglo puede ser mayor de dos dimensiones. Ej.
• Para poder crear el arreglo del diagrama en tres dimensiones, se utilizan las instrucciones que aparecen en el próximo slide:
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 18
Pag. 86
Truck Parts
Código Descripción Precio
TIR Tires 100
OIL Oil 10
SPK Spark Plugs 4
Van Parts
Código Descripción Precio
TIR Tires 100
OIL Oil 10
SPK Spark Plugs 4
Car Parts
Código Descripción Precio
TIR Tires 100
OIL Oil 10
SPK Spark Plugs 4
ARREGLOS MULTIDIMENSIONALES - CREACIÓN
$products = array( array ( array( ‘CAR_TIR’, ‘Tires’,100),
array( ‘CAR_OIL’, ‘Oil’,10),
array( ‘CAR_SPK’, ‘Spark Plugs’,4), )
array ( array( ‘VAN_TIR’, ‘Tires’,120),
array( ‘VAN_OIL’, ‘Oil’,12),
array( ‘VAN_SPK’, ‘Spark Plugs’,5), )
array ( array( ‘TRK_TIR’, ‘Tires’,150),
array( ‘TRK_OIL’, ‘Oil’,15),
array( ‘TRK_SPK’, ‘Spark Plugs’,6),
));
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 19
Pag. 87-88
RECORRER ARREGLO DE TRES DIMENSIONES
for ( $layer = 0; $layer < 3; $layer++)
{
echo “Layer $layer<br />”;
for ($row = 0; $row < 3; $row++ )
{
for ( $column = 0; $column < 3; $column++ )
{
echo ‘|’.$categories[$layer][$row][$column];
}
echo ‘|<br />’;
}
}
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 20
Pag. 87-88
ORDENAR ARREGLOS - SORT• Para ordenar un arreglo de una sola dimensión, escribimos lo
siguiente:$products = array( ‘Tires’, ‘Oil’, ‘Spark Plugs’);
sort($products);
• Quedarían en el siguiente orden: Oil, Spark Plugs, Tires.$prices= array( 100, 10, 4 );
sort($prices);
• Quedarían en el siguiente orden: 4, 10, 100• Existe un segundo argumento en la función sort que indica lo
siguiente:– SORT_REGULAR – Valor default.– SORT_NUMERIC – Valores numéricos– SORT_STRING – Cadenas de caracteres.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 21
Pag. 90
ORDENANDO DESCENDENTEMENTE• rsort() – Organiza los datos en orden descendente.• arsort() – Permite ordenar un arreglo con keys
descriptivos sin que se mezclen el valor del elemento con la descripción en orden descendente.
• krsort() – Permite ordenar un arreglo por su key descriptivo y mantiene su elemento inicial en orden descendente.
OJO – No se va adiscutir Sort en muchas dimensiones.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 22
Pag. 91
REORGANIZANDO ARREGLOS• shuffle() – Organiza elementos en un arreglo al
azar.• array_reverse() – Te invierte el orden de los
elementos en tu arreglo. El primer elemento pasa a ser el último y viceversa.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 23
Pag. 94
OTRAS MANIPULACIONES DE ARREGLOS• each() – Captura los índices, tanto numéricos como en palabras.
Avanza el pointer en el arreglo al próximo elemento.• current() – Devuelve el primer elemento.• reset() – Devuelve el pointer al primer elemento.• end() – Pone el pointer en el último elemento.• next() – Avanza el pointer en el arreglo al próximo elemento.• pos() – Indica posición del pointer.• prev() – Mueve el pointer al próximo elemento en el arreglo.• Ejemplo: Para recorrer un arreglo al revés:$value = end($array);while ($value){
echo “$value<br />”;$value = prev($array);} 8/12/2007 © - Derechos Reservados - Prof. Nelliud D.
Torres 24
Pag. 100
OTRAS MANIPULACIONES DE ARREGLOS (CONT. - 1)
• Si se desea trabajar o modificar todos los elementos de un arreglo, podemos utilizar la función array_walk().
• Ejemplo:
function my_print($value){
echo “$value<br />”;}array_walk($array, ‘my_print’);
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 25
Pag. 101
Hay que definir la función que va a trabajar el arreglo
Aquí se invoka la función y se indica el nombre del arreglo que se va a utilizar.
OTRAS MANIPULACIONES DE ARREGLOS (CONT. - 2)
• count() – Cuenta el número de elementos que tenga un arreglo.• sizeof() – Trabaja similar al count().• array_count_values() – Cuenta las veces que cada valor unico
del arreglo se repite.• Ejemplo: $array = array(4,5,1,2,3,1,2,1);$ac = array_count_values($array);
Esto crea un arreglo llamado $ac con el siguiente contenido: Key Value
4 1
5 1
1 3
2 2
3 1
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 26
Pag. 102
El 4, 5 y 3 se repiten una sola vez en el arreglo. El 1 se repite 3 veces y el 2 se repite 2 veces.
OTRAS MANIPULACIONES DE ARREGLOS (CONT. - 3)
• extract() – Convierte elementos del arreglo a variables (scalar variable), cada variable con su propio valor.
• Ejemplo:
$array = array(‘key1’=>’value1’,’key2’=>’value2’,’key3’=>’value3’);
extract($array);echo “$key1 $key2 $key3”;
Va a producir el siguiente resultado:
value1 value2 value3
Para buscar más información sobre arreglos, ir a la dirección: www.php.net/array
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 27
Pag. 103
LABORATORIO 1• Crear la página principal de Bob’s. El usuario
desea que cada vez que suba la página, muestre tres de las piezas que el vende. Estas piezas deben cambiar cada vez que el usuario entre a la página o se haga un refresh de la misma.
• Se necesita utilizar aquí la función shuffle().• Se necesitan las gráficas que se pueden
conseguir en la página del profesor.• A continuación se muestra el código.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 28
Pag. 94
LABORATORIO 1 - CÓDIGO<?php $pictures = array('tire.jpg', 'oil.jpg',
'spark_plug.jpg', 'door.jpg', 'steering_wheel.jpg', 'thermostat.jpg', 'wiper_blade.jpg',
'gasket.jpg', 'brake_pad.jpg'); shuffle($pictures);?><html><head> <title>Bob's Auto Parts</title></head><body> <center> <h1>Bob's Auto Parts</h1> <table width = 100%> <tr>
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 29
Pag. 94
<?php for ( $i = 0; $i < 3; $i++ ) { echo '<td align="center"><img
src="'; echo $pictures[$i]; echo '"width="100"
height="100"></td>'; }?> </tr> </table> </center></body></html>
Aquí reorganiza el orden
Aquí se muestra el dibujo en un ciclo que se repite tres veces.
LABORATORIO 1 - PANTALLA
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 30
Pag. 95
LABORATORIO 2• Crear un código que lea las órdenes de los clientes que
están en un archivo secuencial y las pase a un arreglo.• El código es similar al listado 2.3 del capítulo anterior.• La diferencia es que utiliza la función file() para cargar
el archivo en una arreglo automáticamente y luego mostrarlo del arreglo al browser.
• Se tiene que utilizar el archivo de ordenes de los laboratorios anteriores.
• A continuación se muestra el código.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 31
Pag. 96
LABORATORIO 2 - CÓDIGO<?php
//create short variable name
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$orders= file("$DOCUMENT_ROOT/./Capitulo-3/orders.txt");
$number_of_orders = count($orders);
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 32
Pag. 96-97
if ($number_of_orders == 0){ echo '<p><strong>No orders pending. Please try again later.</strong></p>';}for ($i=0; $i<$number_of_orders; $i++){ echo $orders[$i].'<br />';}?>
Aquí lee y guarda en el arreglo llamado orders lo que lea del archivo
LABORATORIO 2 - PANTALLA
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 33
Pag. 97
LABORATORIO 3• Crear un código que lea las órdenes de los clientes
que están en un archivo secuencial, las pase a un arreglo y finalmente las muestre en pantalla en formato de tabla.
• Se tiene que utilizar el archivo de ordenes de los laboratorios anteriores.
• A continuación se muestra el código.
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 34
Pag. 97
LABORATORIO 3 - CÓDIGO<?php //create short variable name $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];?><html><head> <title>Bob's Auto Parts - Customer Orders</title></head><body><h1>Bob's Auto Parts</h1><h2>Customer Orders</h2><?php //Read in the entire file. //Each order becomes an element in the array $orders= file("$DOCUMENT_ROOT/./Capitulo-3/orders.txt"); // count the number of orders in the array $number_of_orders = count($orders); if ($number_of_orders == 0) { echo '<p><strong>No orders pending. Please try again later.</strong></p>'; } echo "<table border=1>\n";echo '<tr><th bgcolor="#CCCCFF">Order Date</th> <th bgcolor="#CCCCFF">Tires</th> <th bgcolor="#CCCCFF">Oil</th>
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 35
Pag. 97-98
<th bgcolor="#CCCCFF">Spark Plugs</th> <th bgcolor="#CCCCFF">Total</th> <th bgcolor="#CCCCFF">Address</th> <tr>'; for ($i=0; $i<$number_of_orders; $i++) { //split up each line $line = explode( "\t", $orders[$i] ); // keep only the number of items ordered $line[1] = intval( $line[1] ); $line[2] = intval( $line[2] ); $line[3] = intval( $line[3] ); // output each order echo "<tr><td>$line[0]</td> <td align='right'>$line[1]</td> <td align='right'>$line[2]</td> <td align='right'>$line[3]</td> <td align='right'>$line[4]</td> <td>$line[5]</td> </tr>"; } echo '</table>';?></body></html>
LABORATORIO 3 - PANTALLA
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 36
Pag. 99
REFERENCIAS
• PHP and MySQL Web Development, Third Edition, Luke Welling, and Laura Thomson
• http://www.easyphp.org/
• www.php.net/array
8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 37