11
Abr 10

Función que devuelve la extensión de un archivo en php

Si queremos conocer la extensión de un archivo con una sola función y sin tener que añadir muchas condiciones aquí os dejo una función que lo permite :)

function file_extension( $filename ) {
     return( strtolower( substr( $filename, strripos( $filename, '.' ), strlen( $filename ) ) ) );
}

Notar que la función siempre devuelve la extensión en formato “string” y en minúsculas. Se podría crear una función para saber si un archivo es una imagen, un documento o cualquier otro usando in_array().


11
Abr 10

Copiar la estructura de una tabla MySQL o SQLite

En algunas ocasiones nos viene bien copiar directamente la estructura de una tabla directamente sin tener que ir campo por campo.
El comando SQL para hacerlo es

CREATE TABLE nueva_tabla SELECT * FROM antigua_tabla

11
Abr 10

Clase para crear un sitemap XML

Dada la importancia del sitemap para que los motores de búsqueda nos indexen correctamente y como le queremos indicar esta clase nos puede ser muy útil.


<?php
	class sitemap {
		private var $list_url = array();
		public function add_list( $list_urls ) {
			for( $i = 0; $i < count( $list_urls ); $i++ ) {
				$this->add( $list_urls[$i]['loc'], $list_urls[$i]['priority'], $list_urls[$i]['lastmod'], $list_urls[$i]['changefreq'] );
			}
		}
		public function add( $url, $priority = 0.5, $lastmod = date( 'Y-m-d' ), $changefreq = 'monthly' ) {
			$this->list_url[] = array( 'loc' => $url, 'priority' => $priority, 'lastmod' => $lastmod, 'changefreq' => $changefreq );
		}
		public function generate( $file_name = NULL ) {
			$content = '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
			foreach( $this->list_url as $value ) {
				$content .= '<url><loc>'.htmlspecialchars( utf8_encode( $value['loc'] ) ).'</loc>';
				if( isset( $value['priority'] ) ) $content .= '<priority>'.$value['priority'].'</priority>';
				if( isset( $value['lastmod'] ) ) $content .= '<lastmod>'.$value['lastmod'].'</lastmod>';
				if( isset( $value['changefreq'] ) ) $content .= '<changefreq>'.$value['changefreq'].'</changefreq>';
				$content .= '</url>';
			}
			$content .= '</urlset>';
			if( isset( $file_name ) ) {
				file_put_contents( $file_name, $content );
			}
			return( $content );
		}
	}
?>

Su uso es bastante sencillo, creamos un nuevo objeto denominado sitemap

$smap = new sitemap();

Para ir añadiendo páginas al sitemap:

$smap->add( 'http://www.dominio.com/' );

Si lo añadimos así nos genera el resto de los campos con un valor medio (priority=0.5, changefreq=monthly, lastmod=Fecha de hoy)

Para generar el sitemap:

echo( $smap->generate() );

Esto nos lo muestra. Si lo que queremos es guardarlo en un fichero tendríamos que añadir el nombre del fichero a la función.

Por último hay una función para añadir varias urls a la vez desde un array:

$urls = array(
     array(
          'loc' => 'http://www.dominio.com/',
          'priority' => 0.5,
          'changefreq' => 'monthly'
     ), array(
          'loc' => 'http://www.dominio.com/index.php',
          'priority' => 1,
          'changefreq' => 'weekly'
     ) );
$smap = new sitemap();
$smap->add_list( $urls );
echo( $smap->generate() );

10
Abr 10

Encontrar todos los enlaces de una web

Para encontrar todos los enlaces de una página vamos a usar un objeto DOM.

<?php
$html = file_get_contents('http://www.dominio.com');
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
for ($i = 0; $i < $hrefs->length; $i++) {
       $href = $hrefs->item($i);
       $url = $href->getAttribute('href');
       echo $url.'<br />';
}
?>

Visto en: Webintenta


08
Abr 10

Comprobar si un número es primo

La función comprueba si un número es o no primo y devuelve TRUE o FALSE según sea el caso.

	function is_prime( $n ) {
		$m = (int) sqrt( $n );
		for( $i = 2; $i <= $m; $i++ ) {
			if( $n % $i == 0 ) {
				return( FALSE );
			}
		}
		return( TRUE );
	}

Básicamente lo que hace es recorrer un bucle FOR dividiendo por todos los número naturales que estén situados entre el uno un la raiz cuadrada del propio número (ya que si es primo, no habrá divisores en este intervalo cerrado). Si encuentra un divisor finaliza directamente con FALSE, en caso contrario, cuanto haya terminado de recorrer todo el bucle devolverá TRUE, pues no ha encontrado ningún divisor.
Después de haber probado varios algoritmos diferentes, este es el más eficiente, aunque existen algunos un poco mejores si nos dirigimos a primos de Mersenne, por poner un ejemplo, pero para primos en general, al menos de los que he probado, este es el mejor :)