Desarrollo de aplicaciones web con PHP y MySQL
Vectores en PHP
Sergio Sáez y José Luis Poza
© 2015 Sergio Sáez y José Luis Poza
- Vectores con índice numérico
- Vectores asociativos
- Vectores multidimensionales
- Ordenación de vectores
- Funciones de manipulación de vectores
1. ¿Qué es un vector?
- Las variables que hemos visto hasta ahora eran escalares.
- Una variable escalar almacena un solo valor.
- Los vectores se pueden manejar como una única unidad.
- Un vector almacena un conjunto o secuencia de valores escalares, no necesariamente del mismo tipo.
- Se puede recorrer en un determinado orden.
- Se puede acceder a los valores almacenados mediante un índice o clave.
- Índices numéricos.
- Claves alfanuméricas.
- Ejemplos:
- los valores del pedido
- los precios de cada producto.
2. Vectores indexados numéricamente
- En PHP, los vectores indexados numéricamente comienzan en cero.
- Inicialización:
<?php $productos= array("Frenos", "Aceite", "Ruedas"); ?>
<?php
$productos[0]= "Frenos"
$productos[1]= "Aceite";
$productos[2]= "Ruedas";
?>
<?php
$productos= array("Frenos", "Aceite");
$productos[2]= "Ruedas";
?>
- Añadir nuevos campos:
<?php
$productos[3]= "Fusibles"; // Añade en la posición 3
$productos[]= "Fusibles"; // Añade al final del vector
?>
<?php int count(array vector); ?>
- Índica el número de elementos existentes en el vector.
3. Vectores asociativos
- Permiten asociar una clave alfanumérica a cada valor almacenado.
- Inicialización:
<?php $precios= array("Frenos" => 150,
"Aceite" => 10,
"Ruedas" => 100);
?>
<?php
$precios["Frenos"]= 150;
$precios["Aceite"]= 10;
$precios["Ruedas"]= 100;
?>
<?php
$precios= array("Frenos" => 150);
$precios["Aceite"]= 10;
$precios["Ruedas"]= 100;
?>
4. Recorriendo un vector asociativo
<?php array each (array vector); ?>
- Devuelve el par clave/valor actual para el vector y avanza el cursor del mismo.
- Esta pareja se devuelve en un vector de 4 elementos, con las claves 0, 1, key, y value. Los elementos 0 y key contienen el nombre de clave del elemento actual del vector, y 1 y value contienen el dato.
- Retorna:
- Si el puntero interno para el vector apunta pasado el final del contenido del vector, each() devuelve false.
<?php void list (mixed ...) ?>
- Se usa para asignar una lista de variables en una sola operación.
- Supone que el valor asignado es un vector que contiene índices numéricos y que comienzan con el índice 0.
5. Recorriendo vectores
- Ejemplos:
|
<?php $chorrada= array("Paco", "Pepe", "Sussi", "Juani"); $tonteria= each ($chorrada); echo "<pre>"; print_r($tonteria); echo "</pre>"; ?>
|
Array
(
[1] => Paco
[value] => Paco
[0] => 0
[key] => 0
)
|
|
<?php $chorrada= array("Francisco" => "Paco", "José" => "Pepe"); $tonteria= each ($chorrada); echo "<pre>"; print_r($tonteria); echo "</pre>"; ?>
|
Array
(
[1] => Paco
[value] => Paco
[0] => Francisco
[key] => Francisco
)
|
|
<?php $chorrada= array("Francisco" => "Paco", "José" => "Pepe"); list($nombre, $dimin)= each ($chorrada); echo "$nombre => $dimin<br>\n"; list(, $dimin)= each ($chorrada); echo "$dimin<br>\n"; ?>
|
Francisco => Paco
Pepe
|
- Ejemplo con base de datos
<table cellpadding="4">
<tr>
<th>Nombre empleado</th><th>Sueldo</th>
</tr>
<?php $resultado = mysql($conn, "SELECT id, nombre, salario FROM empleados");
while (list($id, $nombre, $salario) = mysql_fetch_row($resultado)) {
echo " <tr>\n".
" <td><a href=\"info.php?id=$id\">$nombre</a></td>".
" <td>$salario</td>\n".
" </tr>\n";
} ?>
</table>
<table cellpadding="4">
<tr>
<th>Nombre empleado</th><th>Sueldo</th>
</tr>
<tr>
<td><a href="info.php?id=1">Ismael Perez</a></td> <td>1100</td>
</tr>
<tr>
<td><a href="info.php?id=2">Juan Garcia</a></td> <td>1200</td>
</tr>
<tr>
<td><a href="info.php?id=3">Maria Gomez</a></td> <td>1500</td>
</tr>
</table>
<?php mixed reset (array vector); ?>
- Rebobina el puntero interno del vector a su primer elemento.
- Retorna:
- devuelve el valor del primer elemento del vector.
<?php mixed end (array vector); ?>
- Avanza el puntero interno del vector hasta su último elemento.
- Retorna:
- devuelve el valor del último elemento del vector.
<?php mixed next (array vector); ?>
- Mueve el puntero interno del vector al siguiente elemento y devuelve su valor.
<?php mixed prev (array vector); ?>
- Mueve el puntero interno del vector al elemento anterior y devuelve su valor.
<?php mixed current (array vector); ?>
- Devuelve el valor del elemento del vector apuntado por el puntero interno.
<?php mixed key (array vector); ?>
- Devuelve la clave del elemento del vector apuntado por el puntero interno.
No son funciones seguras si el vector contiene elementos cuyo valor se evalúa a false.
<?php foreach(expresion_array as $valor) sentencia; ?>
- Recorre la lista de valores devueltos por la expresión expresion_array.
<?php foreach(expresion_array as $clave => $valor) sentencia; ?>
- Recorre la lista de claves y valores devueltos por la expresión expresion_array.
- La construcción foreach hace una copia del vector.
- Comienza siempre desde el principio del vector. No hace falta hacer reset antes de comenzar y no modifica el puntero interno sobre el vector original.
- Si expresion_array es una variable, se puede modificar los elementos del vector mediante el uso de referencias.
<?php $arr = array(1, 2, 3, 4);
foreach ($arr as &$value) $value = $value * 2;
// $arr ahora vale array(2, 4, 6, 8)
?>
- Recorriendo los valores
|
<?php reset($arr); while(list(, $value)= each($arr)){ echo "Valor: $value<br>\n"; } // endwhile ?>
|
<?php
foreach($arr as $value) { echo "Valor: $value<br>\n"; } // endfor ?>
|
- Recorriendo valores y claves
|
<?php reset($arr); while(list($key, $value)= each($arr)) { echo "Key: $key; "; echo "Valor: $value<br>\n"; } // endwhile ?>
|
<?php
foreach($arr as $key => $value) { echo "Key: $key;"; echo "Valor: $value<br>\n"; } // endfor
?>
|
6. Comprobaciones y borrados
- Comprobar si un elemento existe
- Se puede utilizar la construcción isset() o la función array_key_exists(clave, vector);
- Borrando un elemento de un vector
- Se utiliza la construcción unset();
<?php
$cervezas = array("Heineken" => 4, "Mahou" => 7,
"Aguila" => 12, "Estrella" => 9);
if (isset($cervezas["Voll-Damm"])) {
echo "Ponme un par de Voll-Damms";
} else {
echo "Cómo que no hay Voll-Damm? Bueno, pues un par de Mahous";
}
unset($cervezas["Mahou"]); // Borra el elemento "Mahou"
if (array_key_exists("Mahou", $cervezas)) {
echo "Mmmmhhh!";
} else {
echo "Que tampoco hay Mahou. Pues nada ... que sea una gaseosa";
}
?>
- Comprobar si un valor existe
- Se puede utilizar la función in_array(valor, vector);
- Borrando un valor de un vector
- Se utiliza la función array_search(valor, vector) y la construcción unset();
<?php
$cervezas = array("Heineken", "Mahou", "Aguila", "Estrella");
if (in_array("Voll-Damm", $cervezas)) {
echo "Ponme un par de Voll-Damms";
} else {
echo "Cómo que no hay Voll-Damm? Bueno, pues un par de Mahous";
}
$clave= array_search("Mahou", $cervezas); // Busca el elemento "Mahou"
unset($cervezas[$clave]); // Borra el elemento "Mahou"
if (in_array("Mahou", $cervezas)) {
echo "Mmmmhhh!";
} else {
echo "Que tampoco hay Mahou. Pues nada ... que sea una gaseosa";
}
?>
7. Estructuras de datos en PHP
- Vectores homogeneos
int vector[5]= {
1, 3, 5, 7, 9
};
|
<?php $vector= array(1, 3, 5, 7, 9); ?>
|
- Estructuras de datos
struct {
char * nombre;
char * apellidos;
int a_nacim;
} persona=
{"Sergio", "Saez Barona", 1970};
|
<?php $persona= array( "nombre" => "Sergio", "apellidos" => "Saez Barona", "a_nacim" => 1970); ?>
|
- El vector como una pila y/o una cola
- array_push
- Añade un elemento al final del vector.
- array_pop
- Extrae el último elemento del vector.
- array_shift
- Extrae el primer elemento del vector desplazando las claves.
8. Vectores predefinidos
$_SERVER: Información sobre el servidor.
$_ENV: Información sobre el entorno de ejecucíón del interprete.
$_GET: Contiene las variables de los formularios enviados mediante el método "GET".
$_POST: Idem, pero mediante el método "POST".
$_COOKIE: Contiene las galletas enviadas desde el cliente.
$_FILES: Información sobre los ficheros recibidos.
$_REQUEST = $_COOKIE + $_GET + $_POST + $_FILES.
$_SESSION: Contiene las variables de la sesión actual.
9. Vectores multidimensionales
- Ejemplos
|
<?php $matriz= array ( array(1, 2, 3), array(4, 5, 6), array(7, 8, 9));
$matriz[1][2]= 15; ?>
|
<?php $matriz= array ( "817236" => array(1, 2, 3), "023498" => array(4, 5, 6), "234890" => array(7, 8, 9)); ?>
|
|
<?php $personal= array ( array("nombre" => "Sergio", "apellidos" => "Saez", "a_nacim" => 1970), array("nombre" => "Pedro", "apellidos" => "Garcia", "a_nacim" => 1974), array("nombre" => "Maria", "apellidos" => "Sanchez", "a_nacim" => 1981));
$personal[2]["apellidos"]= "Sanchis"; ?>
|
<?php $personal= array ( "817236" => array("nombre" => "Sergio", "apellidos" => "Saez", "a_nacim" => 1970), "023498" => array("nombre" => "Pedro", "apellidos" => "Garcia", "a_nacim" => 1974, "cargo" => "Jefe de producción"), "234890" => array("nombre" => "Maria", "apellidos" => "Sanchez", "a_nacim" => 1981)); ?>
|
10. Ordenación de vectores
<?php void sort (array vector); ?>
- Ordena los valores del vector de menor a mayor sin mantener la asociación de índices.
- Útil para vectores con índices numéricos.
|
<?php $productos= array("Frenos", "Aceite", "Ruedas"); sort($productos); print_r($productos); ?>
|
Array
(
[0] => Aceite
[1] => Frenos
[2] => Ruedas
)
|
<?php void rsort (array vector); ?>
- Igual que sort(), pero de mayor a menor.
<?php void asort (array vector); ?>
- Ordena una vector por sus valores, manteniendo la asociación de índices.
|
<?php $precios= array("Frenos" => 150, "Aceite" => 10, "Ruedas" => 100); asort($precios); print_r($precios); ?>
|
Array
(
[Aceite] => 10
[Ruedas] => 100
[Frenos] => 150
)
|
<?php void arsort (array vector); ?>
- Igual que asort(), pero de mayor a menor.
<?php void ksort (array vector); ?>
- Ordena una vector por sus claves, manteniendo la asociación de índices.
|
<?php $precios= array("Frenos" => 150, "Aceite" => 10, "Ruedas" => 100); ksort($precios); print_r($precios); ?>
|
Array
(
[Aceite] => 10
[Frenos] => 150
[Ruedas] => 100
)
|
<?php void krsort (array vector); ?>
- Igual que ksort(), pero de mayor a menor.
11. Convertir un vector a escalares
<?php void extract (array vector_vars [, int tipo_extraccion
[, string prefijo]]); ?>
- Esta función se utiliza para importar variables desde un vector a la tabla de símbolos actual.
- Toma el vector asociativo vector_vars y trata las claves como nombres de variable y los valores como los valores de éstas.
- Para cada par clave/valor creará una variable en la tabla de símbolos actual, sujeto a los parámetros tipo_extraccion y prefijo.
- extract() controla las colisiones con las variables que ya existen. La forma de tratar éstas se determina por el tipo_extraccion.
Los valores útiles son:
- EXTR_OVERWRITE (predeterminado)
- Si hay colisión, sobrescribe la variable existente.
- EXTR_PREFIX_ALL
- Añade el prefijo a todas las variables, separándolo mediante un "_".
<?php
$precios= array("Frenos" => 150,
"Aceite" => 10,
"Ruedas" => 100);
extract($precios, EXTR_OVERWRITE);
var_dump($Frenos); var_dump($Aceite); var_dump($Ruedas);
?>
int(150)
int(10)
int(100)
<?php
import_request_varibles("gp", "f_");
?>
<?php
extract($_GET,EXTR_PREFIX_ALL, "f");
extract($_POST,EXTR_PREFIX_ALL, "f");
?>