34
En este apéndice, veremos algunas funciones adicionales que nos permiten, por ejemplo, el manejo de archivos y el tratamiento de matrices en el lenguaje PHP. Ambas nos serán útiles para cargar contenido en una página web y manipular datos variables, ya sea para el cálculo o la administración de información. Funciones adicionales Funciones del sistema de archivos...........................2 Funciones para el tratamiento de matrices ....................... 22 Resumen ........................... 33 Actividades ....................... 34

A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

En este apéndice, veremos algunas funciones adicionales que

nos permiten, por ejemplo, el manejo de archivos y el tratamiento

de matrices en el lenguaje PHP. Ambas nos serán útiles para cargar

contenido en una página web y manipular datos variables, ya sea

para el cálculo o la administración de información.

Funciones adicionales

▼Funciones del sistema

de archivos...........................2

▼Funciones para el tratamiento

de matrices ....................... 22

▼Resumen ........................... 33

▼Actividades ....................... 34

A#_Funciones adicionales.indd 1A#_Funciones adicionales.indd 1 22/04/2014 15:0922/04/2014 15:09

Page 2: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES2

www.redusers.com

Funciones del sistemade archivos

En una aplicación web es usual interactuar con archivos y directorios,

por ejemplo: galerías de imágenes, videos subidos por los usuarios, gene-

ración de gráfi cos para descarga, todas ellas actividades muy frecuentes.

A continuación, haremos un recorrido por algunas de las funciones

más importantes que PHP pone a disposición para manipular archivos

y carpetas desde nuestros scripts.

Hay una directiva en el archivo de confi guración php.ini que será de

gran ayuda en el momento de interactuar con archivos remotos, es decir,

aquellos que se encuentren en otros servidores. Se trata de allow_url_fopen,

que puede estar habilitada (On) o deshabilitada (Off ).

Veamos, como primera medida, las funciones habituales para abrir,

leer y cerrar un archivo. La función fopen recibe dos argumentos principales:

el nombre del archivo (incluida la ruta hacia él) y el modo de apertura.

El segundo argumento nos permite indicar cuál será el tipo de acceso

al archivo: solo lectura, lectura y escritura, etcétera. Observemos cuáles

son las posibilidades:

allow_url_fopen = On

<?php

$fd = fopen(‘archivos/documento.txt’, ‘r’);

?>

A#_Funciones adicionales.indd 2A#_Funciones adicionales.indd 2 22/04/2014 15:0922/04/2014 15:09

Page 3: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 3

www.redusers.com

TIPOS DE ACCESO A LOS ARCHIVOS

▼ MODO ▼ DESCRIPCIÓN

R Apertura para solo lectura.

r+ Apertura para lectura y escritura.

W Apertura para solo escritura.

w+ Apertura para lectura y escritura. Si el archivo existe,

elimina su contenido y, si no existe, intenta crearlo.

A Apertura para solo escritura.

a+ Apertura para lectura y escritura. Si el archivo existe, no se elimina

su contenido (el contenido que luego ingresemos se agrega al fi nal)

y, si no existe, intenta crearlo.

X Creación y apertura para solo escritura. Si el archivo existe,

genera un error y, si no existe, intenta crearlo.

x+ Creación y apertura para lectura y escritura.

Si el archivo existe, genera un error y, si no existe, intenta crearlo.

Tabla 1. Modos de apertura disponibles para fopen.

El archivo php.ini mantiene una directiva denominada include_path, que

se utiliza cuando se incluyen o se abren archivos o directorios. En el caso

de fopen, si intentamos abrir un archivo y no indicamos su ruta:

<?php

$fd = fopen(‘documento.txt’, ‘r’);

?>

A#_Funciones adicionales.indd 3A#_Funciones adicionales.indd 3 22/04/2014 15:0922/04/2014 15:09

Page 4: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES4

www.redusers.com

PHP intentará buscarlo en los directorios defi nidos en esta directiva:

Para que fopen utilice esta funcionalidad, debemos ingresar un tercer

argumento al asignar el valor true o 1:

Esta función devuelve lo que se llama un descriptor de archivo,

que será de utilidad al intentar realizar otras operaciones sobre el archivo,

por ejemplo, leer su contenido.

Luego de fi nalizar el trabajo con el archivo, para cerrarlo usamos

la función fclose de la siguiente manera:

include_path = “.;C:\wamp\php\pear”

<?php

$fd = fopen(‘documento.txt’, ‘r’, true);

?>

fclose($fd);

En caso de que estuviéramos trabajando en plataformas Windows, deberíamos esca-

par las barras invertidas utilizadas en la ruta al archivo. Para lograr esto, podemos

utilizar la función addslashes, que veremos más adelante en este capítulo, en la sección

relativa a las cadenas de caracteres.

RUTAS

A#_Funciones adicionales.indd 4A#_Funciones adicionales.indd 4 22/04/2014 15:0922/04/2014 15:09

Page 5: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 5

www.redusers.com

Hay varias maneras de recuperar la composición de un archivo, y una

de ellas es por medio de la función fread, que recibe como argumentos un

descriptor y la longitud, en bytes, por leer:

Esta función suele utilizarse para trabajar con archivos binarios.

En el ejemplo, leemos el contenido del archivo y lo asignamos a una variable.

La función feof devuelve verdadero cuando se alcanza el fi nal del archivo.

Por su parte, fgets nos permite leer el contenido de un archivo por lí-

neas y recibe como argumento un descriptor:

<?php

$fd = fopen(‘archivos/documento.txt’, ‘r’);

while (!feof($fd)) {$contenido .= fread($fd, 1024);}

fclose($fd);

echo $contenido;

?>

El repositorio de clases ofi cial de PHP, Pear, incorpora un paquete que incluye im-

plementaciones para poder utilizar funciones disponibles en versiones recientes del

lenguaje (es el caso de fi le_get_contents) en versiones anteriores. Podemos obtener

más información en http://pear.php.net/.

PEAR

A#_Funciones adicionales.indd 5A#_Funciones adicionales.indd 5 22/04/2014 15:0922/04/2014 15:09

Page 6: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES6

www.redusers.com

Esta función también recibe, de manera opcional, el número de bytes

por recuperar (como segundo argumento, por defecto, 1024 bytes).

Para realizar funciones similares a las anteriores, contamos con dos funcio-

nes: fi le_get_contents y fi le. Ambas reciben como argumento la ruta del archivo

y devuelven su contenido sin necesidad de utilizar fopen. La diferencia es que

fi le_get_contents entrega el contenido completo, mientras que fi le devuelve un

array que contendrá una posición por cada línea del archivo.

Puede ser que la función fi le_get_contents no esté disponible en todas

las confi guraciones:

<?php

$fd = fopen(‘archivos/documento.txt’, ‘r’);

while (!feof($fd)) {

$c++;

echo “<br /> Linea $c: “.fgets($fd);

}

fclose($fd);

?>

<?php

echo fi le_get_contents(‘archivos/documento.txt’);

?>

A#_Funciones adicionales.indd 6A#_Funciones adicionales.indd 6 22/04/2014 15:0922/04/2014 15:09

Page 7: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 7

www.redusers.com

Asimismo, la función readfi le retorna el número de bytes de un archivo

e imprime su contenido:

Pasemos ahora a cómo escribir contenidos en un archivo por medio

de la función fwrite, que recibe como argumentos un descriptor y la

cadena de caracteres por ingresar:

<?php

echo ‘<pre>’;print_r(fi le(‘archivos/documento.txt’));echo ‘</pre>’;

?>

<?php

readfi le(‘archivos/documento.txt’);

?>

<?php

$fd = fopen(‘archivos/documento.txt’, ‘a+’);

$cadena = “Este es el texto por ingresar - Son las “.date(“H:i:s”).”\n”;

fwrite($fd, $cadena);

fclose($fd);

?>

A#_Funciones adicionales.indd 7A#_Funciones adicionales.indd 7 22/04/2014 15:0922/04/2014 15:09

Page 8: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES8

www.redusers.com

Notemos que, hacia el fi nal de la cadena, incluimos un \n, lo que nos

permite realizar un retorno y avanzar a la siguiente línea. Nuestro archivo,

en el caso de que no tuviera ningún contenido, quedaría constituido así:

Una función similar es fi le_put_contents, que recibe como argumentos

el nombre del archivo y los datos por grabar:

Para agregar al contenido existente del archivo sin truncarlo, podemos

utilizar como tercer argumento la constante FILE_APPEND:

Si accedemos a un archivo que no ha sido creado por nosotros, cabe

la posibilidad, por ejemplo, de que no sea apto para lectura o escritura.

Para averiguarlo, contamos con dos funciones: is_readable e is_writable

(o su alias is_writeable):

Este es el texto por ingresar - Son las 17:56:51Este es el texto por ingresar - Son las 17:56:52Este es el texto por ingresar - Son las 17:56:53Este es el texto por ingresar - Son las 17:56:55

<?php

$archivo = ‘archivos/documento.txt’;

$cadena = “Este es el texto por ingresar - Son las “.date(“H:i:s”).”\n”;

fi le_put_contents($archivo, $cadena);

?>

fi le_put_contents($archivo, $cadena, FILE_APPEND);

A#_Funciones adicionales.indd 8A#_Funciones adicionales.indd 8 22/04/2014 15:0922/04/2014 15:09

Page 9: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 9

www.redusers.com

Además, podemos obtener otra información acerca del archivo,

por ejemplo, a través de la función stat, que devuelve un array:

Entre los datos más importantes fi guran el tamaño en bytes (posición

7), la hora del último acceso (timestamp, posición 8) y la hora de la última

modifi cación (timestamp, posición 9).

<?php

$archivo = ‘archivos/documento.txt’;

if (is_readable($archivo)) {//podemos leerlo

} else { //no podemos leerlo

}

if (is_writable($archivo)) { //podemos escribirlo

} else { //no podemos escribirlo

}

?>

<?php

$array = stat(‘archivos/documento.txt’);

echo ‘<pre>’;print_r($array);echo ‘</pre>’;

?>

A#_Funciones adicionales.indd 9A#_Funciones adicionales.indd 9 22/04/2014 15:0922/04/2014 15:09

Page 10: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES10

www.redusers.com

Otra manera de conocer el tamaño de un archivo es con la función

fi lesize, que recibe como argumento la ruta hacia él:

La función basename devuelve el nombre del archivo sin tener en cuenta

su ruta. Veamos un ejemplo:

Contamos con la función pathinfo, que devuelve un array con diferente

información: la ruta al directorio (dirname), el nombre del archivo

(basename), su extensión (extension), y su nombre sin extensión (fi lename):

<?php

echo fi lesize(‘archivos/documento.txt’);

?>

<?php

$archivo = ‘archivos/documento.txt’;echo basename($archivo); //devuelve ‘documento.txt’

?>

Existen algunas funciones que trabajan sobre los permisos de un archivo: la función chmod

nos da la posibilidad de modifi car los permisos; la función chown nos habilita a cambiar al

propietario, y la función chgrp nos permite cambiar el grupo de un archivo.

PERMISOS

A#_Funciones adicionales.indd 10A#_Funciones adicionales.indd 10 22/04/2014 15:0922/04/2014 15:09

Page 11: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 11

www.redusers.com

Su salida sería similar a lo que mostramos a continuación:

Antes de ver cómo realizar ciertas operaciones, como renombrar archivos,

copiarlos de un lugar a otro e, incluso, eliminarlos, podemos utilizar una

función que nos permite saber si un archivo realmente existe. Su nombre

es fi le_exists, y recibe como argumento la ruta al archivo en cuestión:

<?php

$array = pathinfo(‘archivos/documento.txt’);

echo ‘<pre>’;print_r($array);echo ‘</pre>’;

?>

Array( [dirname] => archivos [basename] => documento.txt [extension] => txt [fi lename] => documento)

<?php

if (fi le_exists(‘archivos/documento.txt’)) {// el archivo existe

} else { // el archivo no existe

}

?>

A#_Funciones adicionales.indd 11A#_Funciones adicionales.indd 11 22/04/2014 15:0922/04/2014 15:09

Page 12: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES12

www.redusers.com

Veamos ahora cómo cambiar el nombre de un archivo a través de la

función rename, que recibe como argumentos el nombre actual y el nuevo:

Para copiar un archivo de un directorio a otro, contamos con la función

copy, que recibe como argumentos la ruta de origen y la ruta de destino:

En cuanto a eliminar un archivo, la función unlink nos permite realizar

esta tarea de manera sencilla. Por ejemplo:

<?php

$nombreActual = ‘archivos/documento.txt’;$nombreNuevo = ‘archivos/nuevoDocumento.txt’;

if (fi le_exists($nombreActual)) {rename($nombreActual, $nombreNuevo);}

?>

<?php

$desde = ‘archivos/documento.txt’;

$hasta = ‘documentos/documento.txt’;

if (fi le_exists($desde)) {

copy($desde, $hasta);

}

?>

A#_Funciones adicionales.indd 12A#_Funciones adicionales.indd 12 22/04/2014 15:0922/04/2014 15:09

Page 13: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 13

www.redusers.com

A continuación, expondremos una serie de funciones muy útiles, que se

refi eren al tratamiento de archivos subidos a un sitio a través de formularios

web. Supongamos el siguiente caso:

<?php

$archivo = ‘archivos/documento.txt’;

if (fi le_exists($archivo)) {

unlink($archivo);

}

?>

<form enctype=”multipart/form-data” action=”?” method=”post”>

Seleccionar archivo: <input name=”fl dArchivo” type=”fi le”>

<input type=”submit” value=”Enviar formulario”>

</form>

Para el popular formato CSV (las hojas de cálculo pueden exportarse a este formato),

PHP mantiene ciertas funciones que nos permiten trabajar con su contenido desde las

aplicaciones. fgetcsv obtiene una línea del archivo apuntado y extrae los campos CSV,

mientras que fputcsv da formato CSV a una línea y la escribe en el archivo apuntado.

CSV

A#_Funciones adicionales.indd 13A#_Funciones adicionales.indd 13 22/04/2014 15:0922/04/2014 15:09

Page 14: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES14

www.redusers.com

Luego de seleccionar un archivo almacenado en el sistema local y presionar

el botón para enviar, desde un script PHP podemos manipular el archivo car-

gado. Lo referente a estos archivos se almacena en un array especial llamado

$_FILES, desde el cual es posible recuperar cierta información importante:

• El nombre original del archivo:

• El tipo de archivo (el tipo MIME, por ejemplo ‘image/png’):

• El tamaño del archivo (en bytes):

• El nombre temporal del archivo:

$_FILES[‘fl dArchivo’][‘name’]

$_FILES[‘fl dArchivo’][‘type’]

$_FILES[‘fl dArchivo’][‘size’]

$_FILES[‘fl dArchivo’][‘tmp_name’]

Tenemos funciones adicionales para el tratamiento de archivos: con fi leatime, obtenemos la

hora del último acceso al archivo; con fi lemtime, la hora de su modifi cación; con fi legroup,

el grupo al que pertenece; con fi leowner, su dueño, y, con fi leperms, sus permisos.

TRATAMIENTO DE ARCHIVOS

A#_Funciones adicionales.indd 14A#_Funciones adicionales.indd 14 22/04/2014 15:0922/04/2014 15:09

Page 15: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 15

www.redusers.com

Sobre esto último debemos tener en cuenta que, al cargar un archivo, PHP

lo almacena de manera temporal en un directorio especial. Luego, podremos

copiar el archivo temporal a otra ubicación defi nida por nosotros.

En todos los casos, reemplazamos fl dArchivo por el nombre que le haya-

mos dado al campo en el formulario de carga.

La función is_uploaded_fi le nos permite saber si el archivo al que hace-

mos referencia en el argumento fue realmente cargado a través de un for-

mulario. Esta función trabaja de la siguiente manera:

Una vez que verifi camos la existencia del archivo, podemos copiarlo a

otra ubicación con la función copy:

<?php

if (count($_POST)) {

$temp = $_FILES[‘fl dArchivo’][‘tmp_name’];

if (is_uploaded_fi le($temp)) {

//el archivo fue cargado

} else {

//el archivo no fue cargado

}

}

?>

$temp = $_FILES[‘fl dArchivo’][‘tmp_name’];

$destino = “imagenes/”.$_FILES[‘fl dArchivo’][‘name’];

copy($temp, $destino);

A#_Funciones adicionales.indd 15A#_Funciones adicionales.indd 15 22/04/2014 15:0922/04/2014 15:09

Page 16: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES16

www.redusers.com

Figura 1. La carga de archivos es algo habitual en las aplicaciones web actuales.

Los dos pasos anteriores (verifi car que el archivo haya sido cargado y,

luego, copiarlo a otra locación) pueden ser reemplazados por la función

move_uploaded_fi le, que trabaja de la siguiente manera:

Estas funciones nos serán de gran utilidad, y haremos uso de ellas en mu-

chas circunstancias, puesto que el trabajo con archivos subidos por medio de

formularios es algo que se presenta en numerosos tipos de aplicaciones.

Hasta ahora, observamos cómo utilizar las funciones más importantes

relacionadas con el tratamiento de archivos. A continuación, veremos qué

funcionalidades nos provee PHP para trabajar con directorios.

Comencemos con dirname, que nos permite conocer el directorio al

que pertenece un archivo:

$temp = $_FILES[‘fl dArchivo’][‘tmp_name’];

$destino = “imagenes/”.$_FILES[‘fl dArchivo’][‘name’];

move_uploaded_fi le($temp, $destino);

A#_Funciones adicionales.indd 16A#_Funciones adicionales.indd 16 22/04/2014 15:0922/04/2014 15:09

Page 17: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 17

www.redusers.com

La función getcwd devuelve el directorio de trabajo actual:

Así como vimos los descriptores de archivos, también contamos con

descriptores de directorios. La función opendir nos permite obtener uno

de ellos, que luego utilizaremos como argumento en otras funciones:

<?php

$archivo = ‘archivos/documento.txt’;

echo dirname($archivo);

?>

<?php

echo getcwd();

?>

PHP mantiene una extensión especialmente dedicada al acceso a directorios y archivos

por medio del protocolo FTP. Esto puede llegar a ser un complemento en casos en

los que, por algún motivo, los alcances de la extensión para el acceso al sistema de

archivos no sean suficientes.

FTP

A#_Funciones adicionales.indd 17A#_Funciones adicionales.indd 17 22/04/2014 15:0922/04/2014 15:09

Page 18: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES18

www.redusers.com

Con closedir, cerramos el descriptor abierto. Para leer el contenido de un

directorio, contamos con la función readdir. Prestemos atención al modo en

que la utilizamos en el ejemplo siguiente:

Su salida sería semejante a:

<?php

$dd = opendir(“archivos”);

//...

closedir($dd);

?>

<?php

$dd = opendir(“archivos”);

while (false !== ($archivo = readdir($dd))) {

echo $archivo.”<br />”;

}

closedir($dd);

?>

A#_Funciones adicionales.indd 18A#_Funciones adicionales.indd 18 22/04/2014 15:0922/04/2014 15:09

Page 19: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 19

www.redusers.com

El punto (.) representa el directorio actual (en realidad, es un enlace al

directorio actual), y los dos puntos (..), el directorio anterior, que también

es un enlace. Al respecto, existen dos funciones que nos permiten saber si

una entrada es un archivo (is_fi le) o un directorio (is_dir). Presentamos un

ejemplo para observar cómo funcionan:

.

..

documento1.txt

documento2.txt

documento3.txt

imagenes

<?php

$dd = opendir(“archivos”);

while (false !== ($archivo = readdir($dd))) {$ruta = “archivos/$archivo”;

if (is_fi le($ruta)) $leyenda = ‘ (archivo)’; elseif (is_dir($ruta)) $leyenda = ‘ (directorio)’; else $leyenda = ‘ (otros)’;

echo $archivo.$leyenda.”<br />”;clearstatcache();}

closedir($dd);

?>

A#_Funciones adicionales.indd 19A#_Funciones adicionales.indd 19 22/04/2014 15:0922/04/2014 15:09

Page 20: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES20

www.redusers.com

En ocasiones, PHP almacena los resultados devueltos por algunas fun-

ciones. Utilizamos clearstatcache para que no los tenga en cuenta, y así po-

damos obtener los resultados actualizados. La salida del código anterior

sería similar a lo que vemos a continuación:

Otra opción para recorrer el contenido de un directorio es a través de

la clase dir, que funciona de este modo:

Por su parte, la función scandir recibe como argumento una ruta a un

directorio y devuelve un array con las entradas encontradas:

. (directorio)

.. (directorio)

documento1.txt (archivo)

documento2.txt (archivo)

documento3.txt (archivo)

imagenes (directorio)

<?php

$dd = dir(“archivos”);

while (false !== ($archivo = $dd->read())) {

echo $archivo.”<br />”;

}

$dd->close();

?>

A#_Funciones adicionales.indd 20A#_Funciones adicionales.indd 20 22/04/2014 15:0922/04/2014 15:09

Page 21: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 21

www.redusers.com

Su salida sería semejante a esto:

<?php

echo ‘<pre>’;

print_r(scandir(“archivos”));

echo ‘</pre>’;

?>

Array( [0] => . [1] => .. [2] => documento1.txt [3] => documento2.txt [4] => documento3.txt [5] => imagenes)

Como hemos visto en casos anteriores, un array no es realmente una función, sino

una construcción del lenguaje. Lo mismo sucede con list, que explicaremos más

adelante en este capítulo. Dada su importancia, decidimos incluirlas en este repaso

de las funciones más destacadas del lenguaje.

¿FUNCIÓN O CONSTRUCCIÓN?

A#_Funciones adicionales.indd 21A#_Funciones adicionales.indd 21 22/04/2014 15:0922/04/2014 15:09

Page 22: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES22

www.redusers.com

Para fi nalizar, veamos en acción a mkdir, que se utiliza para crear un

directorio, y a rmdir, que se usa para eliminarlo. En ambos casos, debere-

mos contar con los permisos sufi cientes para escribir en el directorio.

En el momento de eliminar el directorio, este deberá encontrarse vacío:

Funciones para el tratamiento de matrices

Los arrays son, quizá, la estructura de datos más comúnmente utilizada

en PHP, tanto por su versatilidad como por la gran cantidad de funciones que

el lenguaje brinda. La función inicial es array, que permite crear una matriz:

<?php

for ($c=1;$c<4;$c++) {

mkdir(‘directorio’.$c);

}

rmdir(‘directorio2’);

?>

<?php

$días = array(‘Lunes’, ‘Martes’, ‘Miercoles’, ‘Jueves’, ‘Viernes’);

?>

A#_Funciones adicionales.indd 22A#_Funciones adicionales.indd 22 22/04/2014 15:0922/04/2014 15:09

Page 23: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 23

www.redusers.com

Lo anterior es equivalente al siguiente código:

En el ejemplo visto, a la posición del primer elemento le corresponde

el valor 0, a la del segundo el 1, y así sucesivamente. Durante la creación

del array, podemos defi nir las claves de cada elemento de esta manera:

Lo anterior es equivalente al siguiente código:

<?php

$días[] = ‘Lunes’;$días[] = ‘Martes’;$días[] = ‘Miercoles’;$días[] = ‘Jueves’;$días[] = ‘Viernes’;

?>

<?php

$días = array(‘1’ => ‘Lunes’, ‘2’ => ‘Martes’, ‘3’ => ‘Miercoles’, ‘4’ => ‘Jueves’, ‘5’ => ‘Viernes’);

?>

<?php

$días[‘1’] = ‘Lunes’;$días[‘2’] = ‘Martes’;$días[‘3’] = ‘Miercoles’;$días[‘4’] = ‘Jueves’;$días[‘5’] = ‘Viernes’;

?>

A#_Funciones adicionales.indd 23A#_Funciones adicionales.indd 23 22/04/2014 15:0922/04/2014 15:09

Page 24: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES24

www.redusers.com

La función compact nos permite crear una matriz de valores a partir de

variables previamente defi nidas. Observemos el ejemplo:

La función recibe argumentos y, por cada uno de ellos, busca una varia-

ble del mismo nombre. Si la encuentra, toma su valor y la incluye dentro

del array resultante. La matriz generada en el código anterior es:

<?php

$dia1 = ‘Lunes’;$dia2 = ‘Martes’;$dia3 = ‘Miercoles’;

$dia4 = ‘Jueves’;$dia5 = ‘Viernes’;

$día[] = ‘dia4’;$día[] = ‘dia5’;

$días = compact(‘dia1’, ‘dia2’, ‘dia3’, $día);

?>

Array

(

[dia1] => Lunes

[dia2] => Martes

[dia3] => Miercoles

[dia4] => Jueves

[dia5] => Viernes

)

A#_Funciones adicionales.indd 24A#_Funciones adicionales.indd 24 22/04/2014 15:0922/04/2014 15:09

Page 25: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 25

www.redusers.com

Podemos crear arrays con la función explode, que lo hace a partir de una

cadena de caracteres. Recibe como argumentos un delimitador y una cadena:

Para realizar la operación inversa, es decir, obtener una cadena a partir

de los valores de un array, contamos con la función implode:

<?php

$cadena = ‘Hoy es Domingo 20 de Julio de 2008’;$array = explode(‘ ‘, $cadena);

/*

Array

(

[0] => Hoy

[1] => es

[2] => Domingo

[3] => 20

[4] => de

[5] => Julio

[6] => de

[7] => 2008

)

*/

?>

<?php

$cadena = ‘Hoy es Domingo 20 de Julio de 2008’;

$array = explode(‘ ‘, $cadena);

echo implode(‘ ‘, $array); // $cadena

?>

A#_Funciones adicionales.indd 25A#_Funciones adicionales.indd 25 22/04/2014 15:0922/04/2014 15:09

Page 26: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES26

www.redusers.com

La función array_merge nos permite combinar dos o más arrays para for-

mar uno solo como resultado. En caso de que las matrices componentes

tengan claves iguales, se tomará como defi nitiva la perteneciente al último

array ingresado a la función como argumento:

Si se trata de un array con matrices componentes, podemos utilizar

la función array_merge_recursive, que trabaja en forma recursiva.

Para realizar la operación inversa a array_merge, tenemos array_chunk, que

genera uno o más arrays a partir de una entrada. La función array_combine

compone un array a partir de dos datos: un array de claves y otro de valores.

Tanto array_pad como array_fi ll, respectivamente, completan o generan

un array con valores hasta llegar a un límite dado:

<?php

$array1 = array(‘a’, ‘b’, ‘c’, ‘d’);$array2 = array(‘e’, ‘f’, ‘g’);$array3 = array(‘h’);

$array = array_merge($array1, $array2, $array3);

?>

<?php

$array = array_fi ll(2, 10, ‘valor’);

/*

Array

(

[2] => valor

A#_Funciones adicionales.indd 26A#_Funciones adicionales.indd 26 22/04/2014 15:0922/04/2014 15:09

Page 27: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 27

www.redusers.com

En general, nos será necesario conocer y poder visualizar la estructura

interna de un array, y para eso contamos con la función print_r, la cual

puede ser utilizada no únicamente con matrices:

[3] => valor

[4] => valor

[5] => valor

[6] => valor

[7] => valor

[8] => valor

[9] => valor

[10] => valor

[11] => valor

)

*/

?>

<?php

$días = array(‘1’ => ‘Lunes’, ‘2’ => ‘Martes’, ‘3’ =>

‘Miercoles’, ‘4’ => ‘Jueves’, ‘5’ => ‘Viernes’);

echo ‘<pre>’;

print_r($dias);

echo ‘</pre>’;

/* Salida:

Array

A#_Funciones adicionales.indd 27A#_Funciones adicionales.indd 27 22/04/2014 15:0922/04/2014 15:09

Page 28: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES28

www.redusers.com

Utilizamos la etiqueta pre para mantener el formato original de la sa-

lida dentro del contexto de una página XHTML. Otra función que puede

servirnos es var_dump:

La función count nos permite obtener el número de elementos de una

matriz. El modo en que la utilizamos es el que mostramos a continuación:

<?php

$días = array(‘1’ => ‘Lunes’, ‘2’ => ‘Martes’, ‘3’ =>

‘Miercoles’, ‘4’ => ‘Jueves’, ‘5’ => ‘Viernes’);

echo ‘<pre>’;

var_dump($días);

echo ‘</pre>’;

?>

(

[1] => Lunes

[2] => Martes

[3] => Miercoles

[4] => Jueves

[5] => Viernes

)

*/

?>

A#_Funciones adicionales.indd 28A#_Funciones adicionales.indd 28 22/04/2014 15:0922/04/2014 15:09

Page 29: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 29

www.redusers.com

Opcionalmente, recibe un segundo argumento que, en caso de valer 1,

cuenta los elementos internos de la matriz. Recordemos que un array pue-

de contener elementos de cualquier tipo, incluso otros arrays.

Con array_count_values recuperamos un nuevo array que tendrá como

clave los valores de la matriz original y, como valores, las ocurrencias

de cada una de ellas.

La función array_push nos permite agregar elementos (segundo argu-

mento, puede ser una variable o un array) al fi nal de una matriz previa-

mente declarada, primer argumento. Para añadir elementos al principio,

utilizamos la función array_unshift.

Podemos extraer elementos de una matriz con array_shift (el primero)

o con array_pop (el último). Ambas funciones

devuelven el elemento quitado y modifi can

la matriz original. Con array_slice extraemos

porciones de una matriz y, con array_splice,

las sustituimos por otros valores.

Una matriz está compuesta por pares

clave/valor. Para obtener un array con todas

las claves, tenemos la función array_keys y,

para recuperar un array con todos los valores,

tenemos la función array_values.

Para saber si un valor o una clave existen

dentro de un array, contamos con las funciones

<?php

$m = array(‘Yeah Yeah Yeahs’, ‘The Long Blondes’);

echo count($m); //2

?>

PARA OBTENER

UN ARRAY CON

TODAS LAS CLAVES,

USAMOS LA FUNCIÓN

ARRAY_KEYS

A#_Funciones adicionales.indd 29A#_Funciones adicionales.indd 29 22/04/2014 15:0922/04/2014 15:09

Page 30: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES30

www.redusers.com

in_array y array_key_exists, respectivamente. La primera recibe como argumen-

tos un valor y un array, mientras que la segunda recibe una clave y un array.

Si se encontraron coincidencias devuelven verdadero; en caso contrario, falso.

La función array_search requiere como argumentos un valor y una ma-

triz; si el valor está disponible, devuelve su clave.

Una función importante es array_unique, que nos permite eliminar los

valores duplicados que se encuentran en la matriz pasada como argumento.

No afecta al array original, sino que devuelve uno limpio.

Hay múltiples funciones que nos permiten ordenar un array según

un criterio u otro. Comencemos por ver la función sort:

El segundo argumento indica el tipo de ordenamiento: SORT_NUMERIC

trata los valores como numéricos, SORT_STRING los toma como cadenas de

<?php

$valores[] = ‘1’;$valores[] = 9;$valores[] = ‘10’;$valores[] = ‘2’;

sort($valores, SORT_NUMERIC);

/*

Array

(

[0] => 1

[1] => 2

[2] => 9

[3] => 10

)

*/

?>

A#_Funciones adicionales.indd 30A#_Funciones adicionales.indd 30 22/04/2014 15:0922/04/2014 15:09

Page 31: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 31

www.redusers.com

caracteres, y SORT_REGULAR ordena normalmente sin cambiar los tipos de

datos originales. Esta función no mantiene la relación entre valores e índi-

ces, como observamos en el ejemplo anterior. En caso de que quisiéramos

mantenerla, podríamos utilizar la función asort:

Para ordenar una matriz inversamente, disponemos de la función rsort,

y, para mantener la correlación original entre claves e índices, podemos

utilizar arsort. Ambas toman los mismos argumentos que sort.

Las funciones vistas hasta ahora nos permiten ordenar según dis-

tintos criterios, siempre a partir de los valores de cada posición de un

array. En caso de que necesitemos ordenar por clave, existen las funcio-

nes ksort y krsort para el orden inverso.

<?php

$valores[] = ‘1’;$valores[] = 9;$valores[] = ‘10’;$valores[] = ‘2’;

asort($valores, SORT_NUMERIC);

/*

Array

(

[0] => 1

[3] => 2

[1] => 9

[2] => 10

)

*/

?>

A#_Funciones adicionales.indd 31A#_Funciones adicionales.indd 31 22/04/2014 15:0922/04/2014 15:09

Page 32: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES32

www.redusers.com

Una función adicional para ordenar arrays es natsort. Esta función aplica

el llamado algoritmo de orden natural que, básicamente, intenta ordenar de

acuerdo con la lógica que aplicaría un ser humano. La función natcasesort es

similar, pero no diferencia mayúsculas de minúsculas. Ambas solo reciben

como argumento un array y mantienen la relación entre claves y valores.

La función array_multisort, por su parte, nos permite ordenar un array de

más de una dimensión de manera recursiva. En el momento de recorrer un

array, podemos utilizar bucles for o foreach, por ejemplo. Veamos ambos casos:

En este sentido, contamos con funciones para movernos dentro de un

array; para ilustrar esto, observemos el siguiente ejemplo:

<?php

$array = array(‘a’, ‘b’, ‘c’, ‘d’);

foreach ($array as $clave => $valor) {echo “Clave $clave : $valor <br />”;}

?>

<?php

$array = array(‘a’, ‘b’, ‘c’, ‘d’);

for ($c=0;$c<count($array);$c++) {echo “Clave $c : $array[$c] <br />”;}

?>

<?php

$letras = array(‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’);

A#_Funciones adicionales.indd 32A#_Funciones adicionales.indd 32 22/04/2014 15:0922/04/2014 15:09

Page 33: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

PHP DESDE CERO 33

www.redusers.com

La función current recibe como argumento un array y nos devuelve el valor

de la posición actual, pero falso si ya no hay más posiciones. Por medio de key,

obtenemos la clave actual. A través de next avanzamos a la siguiente posición.

Otras funciones relativas son prev, que retrocede una posición; reset,

que retrocede a la primera posición; end, que avanza hasta la última; each,

que devuelve la siguiente posición y avanza a la siguiente.

La función array_walk recorre automáticamente cada posición de un array

y le aplica una función especifi cada por el usuario; array_walk_recursive realiza

la misma tarea, solo que también toma los arrays interiores, si es que los hay.

La función shuffl e reordena aleatoriamente los elementos de una matriz.

Por su parte, array_rand recibe un array y devuelve una cantidad (segun-

do argumento) de posiciones aleatorias. Si es 1, devuelve una cadena con

la clave elegida y, si es más de uno, un array con las claves.

Por último, veamos list, una interesante alternativa que nos permite

asignar valores de un array a variables en una sola línea.

Conocimos las herramientas que nos ofrecen dos funciones muy utilizadas en PHP,

que nos permiten la carga y el manejo de archivos, la administración de datos en memoria,

y principalmente, continuar enriqueciendo nuestro aprendizaje sobre desarrollo web.

RESUMEN

while ($array = current($letras)) {echo key($letras).’: ‘.current($letras).’<br />’; next($letras);}

?>

A#_Funciones adicionales.indd 33A#_Funciones adicionales.indd 33 22/04/2014 15:0922/04/2014 15:09

Page 34: A# Funciones adicionalespremium.redusers.com.s3.amazonaws.com/LIBROS/PHP desde cero/… · Hay una directiva en el archivo de confi guración php.ini que será de gran ayuda en el

APÉNDICE A. FUNCIONES ADICIONALES34

www.redusers.com

TEST DE AUTOEVALUACIÓN

1 Nombre los comandos utilizados para apertura, carga y eliminación de archivos.

2 ¿Cómo le indicamos a una página web la ruta de los archivos que debemos cargar?

3 ¿Cuál es la utilidad de la función fi le_exists?

4 ¿Cuál es la función de los arrays?

5 ¿Cómo podemos cargar los arrays?

EJERCICIOS PRÁCTICOS

1 Utilizando las funciones pertinentes, genere la carga de archivos de imágenes para una página web; el desafío es mostrar una vista previa de cada archivo guardado.

2 Almacene en un array la estructura de archivos cargados (los nombres)y, luego, lístelos en una página de consulta.

3 Genere un archivo de texto que almacene la lista de imágenes creadas.

4 Cargue una matriz con valores hasta 20 y, luego, lístelos en una página.

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse

con nuestros expertos: [email protected].

PROFESOR EN LÍNEA

Actividades

A#_Funciones adicionales.indd 34A#_Funciones adicionales.indd 34 22/04/2014 15:0922/04/2014 15:09