Ayuda con cadenas de texto

Escrito el 24/Abril/2008 por juan_belon

Todo sobre cadenas de texto

Introducción

Vamos a aprender como encontrar, transformar y borrar palabras ya que es algo así como una tarea esencial de todo ingeniero de aplicaciones web que se precie.Además tomaremos consciencia de los métodos usados para ahorrarnos escribir texto de entrada/salida en nuestras aplicaciones a la hora de crear mecanismos automáticos con los que operar en nuestras aplicaciones.

Verás funciones de este artículo que son bastante simples pero se mencionan por si nunca antes las habias visto, lo estamos haciendo fácil para todos. Las funciones más complejas usan expresiones regulares, una parte muy potente de PHP que todo programador ha de conocer.

Extraer parte de una cadena

El problema de un buscador es que se suele buscar en formas plurales y los programadores dándonos cuenta de esto, tenemos que ingeníarnoslas para procesar el texto y hacer que el usuario encuentre lo que busca en la base de datos. Para eliminar las ‘s' de una cadena se puede utilizar la función substr(cadena, inicio, fin) de forma que podemos comprobar si la última letra se debe eliminar con un básico:
if (susbstr( cadena, -1, 1)=='s')

Una vez que has encontrado una subcadena que te interesa hay una serie de operaciones que puedes realizar con ella:

  • Reasignar una porción específica de la cadena usando substr() para eliminar los caracteres que sobran.
    Ejemplo: $cadena = substr($cadena, 0, 10);
    Lo que hace es poner en $cadena los 10 primeros caracteres de $cadena,empezando por el primero.
  • Eliminar los últimos N caracteres con substring y strlen().
    Ejemplo: $cadena = substr($cadena,0 ,strlen($cadena)-3);
    Guarda en $cadena todos los caracteres menos los 3 últimos.
  • Reemplazar caracteres con substr_replace(cadena_original, cadena_reemplazo,inicio, longitud) que permite especificar una subcadena y reemplazarla con otra, por ejemplo:
    $cadena = substr_replace('abcdef','bbb',1,2)
    guarda en $cadena la cadena ‘abbbdef'

Operaciones con Mayúsculas y Minúsculas

Un problema que puede surgir con PHP y MySQL es que este sistema gestor de bases de datos es sensible a mayúsculas pero soporta campos que no lo son, sin embargo, las cadenas en PHP son sensibles a mayúsculas, asi que prentendemos asegurar que no habrá malentendidos entre ambos y que nos vamos a llevar bien :) Para ello disponemos de una consulta MySQL donde no hay diferencia entre Juan y JUAN , sin embargo en PHP son dos cadenas distintas, asi que necesitamos pasar toda la cadena en este lenguaje a mayúsculas antes de compararlas o imprimirlas por pantalla.
PHP tiene varias funciones esenciales para realizar este tipo de tareas:

  • strtolower(): pasa toda la cadena a minúsculas
  • strtoupper(): pasa toda la cadena a mayúsculas
  • ucwords(): convierte la primera letra de cada palabra de la cadena a mayúsculas
  • ucfirst(): convierte la primera letra la cadena a mayúsculas

Ejemplo

 

<?php$cadena = "HOla qUe Tal CoMo EstAs?";

echo strtoupper($cadena);

//imprime "HOLA QUE TAL COMO ESTAS?"

echo strtolower($cadena);

//imprime "hola que tal como estas?"

echo ucwords(strtolower($cadena));

//usando un truquito para pasar primero la cadena a min�sculas

//imprime "Hola Que Tal Como Estas?"

echo ucfirst(strtolower($cadena));

//imprime "Hola que tal como estas?"

?>

Hemos de tener en cuenta que si nuestra cadena tiene letras separadas por otros caracteres que no sean un espacio,se interpretan como una única palabra, es decir, juan-belon se interpreta como una sóla palabra, para realizar este tipo de conversiones a palabras en esta forma necesitamos crear una expresión regular que detecte dicho formato o algo más fácil,como construir una lista en un array y pasárselo a la función str_replace() como argumento para reemplazarlo. Ejemplo de conversiones que no queremos que se hagan:

 

<?phpfunction formatear_titulo($cadena){

//Primero el array de palabras que no queremos que se pasen a may�sculas, pronombres,preposiciones,etc.

$mayusculas = array("De","A ","El ","La ","Y ","Un ","Una ","O ");

//Ahora el conjunto de reemplazos, en el mismo orden!!

$minusculas = array("de ","a ","el ", "la ","y ","un ","una ","o ");

$cadena = ucwords(strtolower($cadena));

$cadena = str_replace($mayusculas, $minusculas, $cadena);

//Ahora devolvemos la cadena con la primera letra en may�scula:

return ucfirst($cadena);

}

?>

Debemos tener en cuenta que como en el caso anterior, si teníamos una cadena como Juan-Belon, la función ucwords(strtolower()) ha eliminado su mayúscula en Belon, si es importante preservar dichas capitalizacionese entonces puedes usar una comparación mediante la función strcasecmp(cadena1, cadena2);

Encontrar subcadenas

PHP tiene bastantes funciones que permiten encontrar subcadenas en una cadena dada. La elección depende de lo que quieras hacer con el resultado. Algunas funciones básicas:

  • strpos():
    encuetra la posición de la primera ocurriencia de la subcadena pasada
  • strrpos(): encuentra la posición de la última ocurrencia de la subcadena proporcionada, en la cadena pasada como argumento. A partir de dicha posición se puede extraer el contenido restante con substr() ,o se puede hacer con la siguiente función
  • strstr(): devuelve todo lo que hay después de la primera ocurrencia de la subcadena dada

Estas funciones devuelve False si la subcadena no se encuentra presente en la cadena original, hay que llevar cuidado pues la primera ocurrencia puede estar en la posición 0 de la cadena, lo que se puede interpretar como un valor False usado en un condicional, es por eso que debemos usar "===false" en lugar de "==false".
La triple igualdad asegura que los valores y los tipos de los términos del operador de comparación son los mismos, es importante porque puedes obtener valores no esperados como resultado de una comparación.
Veamos un ejemplo:

 

<?php$cadena = "Yo apruebo todas mis asignaturas porque estudio lo suficiente en mi estudio particular";

$termino = "estudio";

//Aparece el término en la cadena?

$pos = strpos($cadena, "estudio");

if ($pos === false){

echo "No se ha encontrado el término ‘$termino' en la cadena ‘$cadena'";

} else {

echo "Se ha encontrado el el término ‘$termino' en la cadena ‘$cadena' en la posición: $pos<br>";

echo "Última posición:".strval(strrpos($cadena, $termino))."<br>";

echo strstr($cadena, $termino)."\n";

//Imprime desde el primer "estudio":

echo substr($cadena, strrpos($cadena,$termino))."<br>";

//Imprime "estudio particular"

}

?>

Recordar que estas funciones son sensibles a mayúsculas, y que se están comparando subcadenas, no palabras, para ello necesitamos construir una expresión regular.
Reemplazar texto es muy útil, de hecho se puede construir un sistema de plantillas con la función str_replace super rápido…
Ahora vamos a ver un pequeño ejemplo de esto…

Notación "Camello"

Esta notación se utiliza para convertir nombres usados en un programa en nombres para mostrar por la pantalla del usuario.

Algunos frameworks (conjunto de librerias de programación) utilizan mecanismos en clases para pluralizar palabras y formas verbales…aunque algunas veces estos mecanismos transparentes resultan de lo más complicado de entender gracias a los comicos nombres y formas, como "camellizar" y otras parodias XD

 

<?php/**

* Pasa de formato Camel a texto que se puede leer por un humano

* @param str $cadena

* @return str

*/

function humanizar($cadena) {

return ucfirst(preg_replace(‘/([a-z])([A-Z])/', ‘\1 \2′, $cadena));

}

/**

* Pasa una cadena a texto en notación "Camel" para usarla en un programa

* @param str $cadena

* @return str

*/

function camellizar($cadena) {

if (!isset($cadena[0])) {

return ";

}

$cadena = ucwords(strtolower($cadena));

$cadena = preg_replace(‘/[^a-zA-Z0-9]/', ", $cadena);

$cadena[0] = strtolower($cadena[0]);

return $cadena;

}

?>

El término CamelCase describe la apariencia de las PalabrasEnCodigo. Varias palabras unidas sin espacios entre sí, mezclando mayúsculas y minúsculas. Las letras mayúsculas y minúsculas se asemejan a las jorobas de un camello, de ahi lo del animalillo XD

Veamos un ejemplo de uso:

 

<?php echo humanizar(‘ejemploTextoCamello');

// Salida: Ejemplo Texto Camello

echo humanizar(‘nombreProducto');

// Salida: Nombre Producto

echo camellizar(‘Ejemplo Texto Camello');

// Salida: ejemploTextoCamello

echo camellizar(‘Nombre - Producto');

// Salida: nombreProducto

?>

Expresiones Regulares

El tema de las expresiones regulares se sale un poco del tratamiento de cadenas y es algo un poco más complejo que ha de ser tomado con cautela para comprenderlo…

Algunos ejemplos más podeis verlos en :

  • Compactadores de HTML
  • Filtros para guardar ficheros: $fichero = ereg_replace('(([^0-9a-zA-Z_\.])+)', "",basename($f[$i]));
  • Filtros para comprobar que una cadena es un correo electrónico:

     

    <?php
    /**

    * Utiliza una expresion regular para comprobar que el $correo pasado es realmente un correo electronico

    *

    * @param str $correo

    * @return bool

    */

    function zen_es_correo($correo){

    return preg_match(

    ‘/^[\ a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,6}$/i',

    $correo

    );

    }

    ?>

  • Funciones para procesar fechas

etc.

PCQHQUPPVLS vol.1

Escrito el 22/Abril/2008 por pabloko

PCQHQUPPVLS=Pequeñas cosas que hacen que un programador pueda ver luz solar xD

Via RSS me ha llegado una lista con javascript de todas las provincias Españolas Y TODAS LAS LOCALIDADES!!!!

Imprescindible en tiendas online, catalogos o similares

http://www.midiariodigital.com/provinciasesp.htm

(este post se irá ampliando en los proximos dias)

Libros para continuar cuando ya crees que te lo sabes todo de PHP

Escrito el 10/Abril/2008 por juan_belon

Cuando has llegado a ciertos niveles de conocimientos de programación muy altos, …como mientras escribes un sistema gestor de contenidos después de escribir un framework completo XDD puedes encontrar muy útiles los siguientes libros:

El primero es genial, empieza introduciendo el ámbito de la construcción del acueducto de Segobia, la compara,evidentemente con un proyecto bien hecho, así pueden pasar hasta 2mil años y no lo tira ni las catástrofes medioambientales :D
Es una muy buena ayuda, estoy leyéndolo como apoyo para construir el sistema gestor de contenidos de zenphp basado en el framework del mismo. Algo muy lírico, fácil de leer, en inglés pero amigable :) Recomendación!
El segundo es una guía para los programadores PHP para ver lo fácil que resulta pasar código de PHP a Ruby On Rails…aún no me llama mucho la atención ,es más que nada una curiosidad que puede acabar en que me pase completamente a RoR :)
Por último, una pieza muy singular, lo he visto justo cuando me iba y al leer lo primero que he visto me ha parecido estupendo, es un libro para los que ya saben PHP, para hacer las cosas más simples…por qué hacer algo complejo cuando haciéndolo simple se puede hacer antes! ;) Recomendación!! 

Hasta aquí los libros del comienzo del año. Seguid atentos a las pantallas!

Todo sobre Funciones en PHP

Escrito el 07/Abril/2008 por juan_belon

He considerado oportuno explicar desde las cosas más básicas y sencillas con respecto a las funciones hasta las más complejas, ya que nos pueden ahorrar inventarnos otros mecanismos más inadecuados si no conocemos las maravillosas características que se pueden tener un método o función bien construido. Empecemos pues por lo más fácil y vayamos aumentando el nivel

Declarar una función simple: desde PHP4 se pueden declarar antes y después del lugar donde es llamada.


<?php
function imprimirNegrita($texto){
echo
"<b>$texto</b>";
}
echo
"Linea sin negrita<br />";
imprimirNegrita("Linea en negrita<br />");

?>


La sentencia return
En un punto de la función se encontrará en un estado final y dispuesta a devolverle el control a quien la llamó, por ejemplo cuando llega al final del bloque de código de la función, la ejecución coge entonces la línea siguiente de aquella donde fue llamada. Otra forma de para la ejecución de la función es usar la sentencia return. Seguramente existirán varias en una función, pero usar demasiados puede ser una barrera para comprender el flujo de la ejecución y hace más difícil la lectura del código. Lo ideal es tener una entrada y una salida pero en la práctica hay casos en los que es más que aceptable tener múltiples sentencias return.


<?php
function hacerNegrita($texto){
$texto = "<b>$texto</b>";
return
$texto;
}
echo
"Linea sin negrita<br />";
echo
hacerNegrita("Linea en negrita<br />");

?>


Paso por referencia y por valor:
Para la mayor parte de los tipos de datos ,las variables pasadas como argumentos de la función se hacen por valor, en PHP4 se puede forzar a pasarlos por referencia mediante el uso de "&" justo antes del nombre de la variable: "&$variable". Las funciones también disponen de esta característica si realizamos algo como lo siguiente:


<?php
function &amp;obtenerMatrizAleatoria(){
$matriz = array();
for (
$i=0; $i < 10; $i++ ){
$a[] = rand(1,100);
}

return $a;
}

$nuevaMatriz =&amp; obtenerMatrizAleatoria();

?>


Sin embargo, hay que tener en cuenta que el uso de & estará "vetado" a partir de PHP6.x o superiores y si usamos la referencia con una sentencia new aparecerá un error de tipo STRICT a partir de la versión 5 de PHP.


<?php
class MiClase {
/** Constructor de MiClase */
function MiClase(){}
}
$c =&amp; new MiClase(); //Devuelve "deprecated" en PHP5.x+

?>


Ámbitos
El ámbito ,también llamado "scope", se creaó para evitar colisiones entre variables de diferentes funcione, PHP incluye dicha noción de ámbito. Cada línea de código pertenece a un determinado "scope". El código dentro de una función se considera que pertenece al ámbito de la propia función. El código fuera de la función pertenece al ámbito global del fichero. El ámbito es la propiedad que determina qué tabla de memoria se usa para almacenar las variables y alternativamente qué variables son accesibles. Por lo tanto ,las variables de una función son locales a ésta,por lo que no se podrán modificar desde fuera de ella ya que son de propiedad privada. Sin embargo las variables globales fuera de la función han de declararse como globales accesibles por medio de la sentencia "global" antes del nombre de variable, ejemplo: "global $mivariable" es accesible en una función si realizamos dicho acceso de la variable declarada fuera:


<?php
$ciudad  
= "Granada";
function
miCiudad(){
global
$ciudad;
mostrarCiudad($ciudad);
}
function
mostrarCiudad($nombre){
echo
"La ciudad seleccionada es :".$nombre."<br />";
}
function
OtraCiudad(){
$ciudad = "Sevilla";
mostrarCiudad($ciudad);
}
miCiudad();
OtraCiudad();

}

?>


Cuando se ejecuta el script se muestra Granada y Sevilla en ese orden. Aunque hayamos modificado $ciudad dentro de la función OtraCiudad() ,no es la misma que la del ámbito global.

La sentencia global lleva una variable a un espacio de nombres de una función,desde ese momento se puede modificar dentro o fuera de aquella. Así es posible referenciar la variable a través del array $_GLOBALS donde se indexan por el nombre, de forma que podríamos acceder a "global $ciudad" por medio de "$_GLOBALS['ciudad']".

Variables estáticas
Recordemos que cuando creamos una variable dentro de una función sólo existe mientras la función se esté ejecutando. Una vez que la ejecución finalice y se pase el control al proceso que realizó la llamada, todo el espacio de variables para esa función es borrado, a veces esto no es lo deseable porque necesitamos que la función recuerde el último estado de las variables entre llamadas, esto se puede implementar por medio del uso de la sentencia "static".
En el comienzo de la función antes de los comandos debes declarar las variables que van a ser estáticas,entonces mantendrán su valor incluso después de abandonar la función. Veamos un ejemplo sencillo para usar esto (alternar colores de las celdas de una tabla):


<?php
function alternarColor(){
//Recordar Color usado
static $color = "#00FF00″;
if (
$color=="#00FF00″){
$color = "#CCFFCC";
} else {
$color = "#00FF00″;
}
return
$color;
}
echo
‘<table>';
for (
$i=1; $i < 11; $i++){
$color = alternarColor();
//Mostrar la fila en el color alternado:
echo ‘<tr><td bgcolor="‘.$color.‘">Fila ‘.$i.‘</td>'."\n";
}
echo
‘</table>';

?>


Argumentos
Cuando se declara una función es posible que necesitemos usar argumentos dentro del paréntesis y separados por comas, si se usa el operador & se pasan por referencia (se pasa la dirección de memoria de la variable desde la llamada) y si no se especifica se pasan por valor (se hace una copia de la variable), los cambios realizados sólo permanecen después de salir de la función con el paso por referencia.
Un argumento puede tener un valor por defecto, esto se hace con una asignación (usando el "=" ) al especificar el nombre de variable dentro del paréntesis de la declaración de la función, ejemplo:


<?php
function mostrarColor($texto, $color="black", &amp;$cuenta=NULL){
echo
‘<span style="color:'.$black.‘;">'.$texto.‘</span>';
//La función isset() comprueba que $cuenta no tenga un valor NULL (nulo).
if (isset($cuenta) &amp;&amp; is_numeric($cuenta)) $cuenta = intval($cuenta)+1;
}

mostrarColor("Texto en negro").‘<br />';
mostrarColor("Texto en azul","blue").‘<br />';
//Ahora declaramos $c para pasársela como argumento a la función:
$c = 0;
mostrarColor("Texto en rojo con cuenta","red",$c).‘<br />';
mostrarColor("Texto en verde con cuenta","green",$c).‘<br />';
echo
"Cuenta total: $c <br />";

?>


La cuenta ha de tener 2 al final de la ejecución.

Funciones para recuperar propiedades de una función
Podemos acceder a los argumentos por su posición usando tres funciones:

  • func_get_arg($numero_argumento): el primer argumento tiene índice 0.
  • func_get_args(): el primer argumento también tiene índice 0.
  • func_num_args(): devuelve el número de argumentos de una función

Ejemplo para usar estas funciones:


<?php
function crearLista(){
echo
"<ol>\n";
$n = func_num_args();
for (
$i=0; $i < $n ; $i++ ) {
echo
"<li>". func_get_arg($i)."\n";
}
echo
"</ol>\n";
crearLista("GNU/Linux","Apache","MySQL","PHP","XML");
}

?>


Para recuperar los nombres de las clases existe "get_class($variable_instancia_objeto)" que devuelve el nombre como una cadena, para obtener sus métodos en un array de los nombres de los métodos de la clase, usa "get_class_methods($nombre_clase)" o la alternativa con el objeto: "get_class_methods($variable_instancia_objeto)". Para obtener las variables de una clase en un array , usa "get_class_vars($nombre_clase)" y la variante para el objeto instanciado es "get_object_vars($variable_instancia_objeto)". Además podemos recuperar el nombre del padre de la clase con "get_parent_class($variable_instancia_objeto)" o bien con "get_parent_class($nombre_clase)". Quizás una útil función es "is_a(object $instancia, string $clase)", que sirve para comprobar si una determinada variable $instancia de objeto es del tipo especificado en la cadena $clase. De hecho, si la clase ha heredado de otra se pueden comprobar con "is_subclass_of(object $instancia, string $nombre_clase)", por último para comprobar si existe un método en la instancia de un objeto dado: boolean method_exists(object $instancia, string $nombre_metodo)".

Recursividad
¡Qué sería de las funciones sin la recursividad! . Nuestras funciones hacen llamadas a otras funciones y estas al mismo tiempo pueden hacer llamadas a si mismas. El proceso de una función que se llama a sí misma se llama Recursividad. Esta definición circular lleva a la elegancia del diseño de algoritmos, también se puede definir como la solución a un problema que se subdivide en subproblemas más pequeños varias veces. Son muy comunes en Matemáticas, ejemplo: la serie de Fibonacci. En zenphp podemos encontrar funciones implementadas que usan esta técnica [ver]. A veces puede resultar complejo comprender un algoritmo recursivo y nos lleva un tiempo realizar la traza de la ejecución. Se suele utilizar por motivos de eficiencia, ya que 10 llamadas en PHP necesita mantener 10 copias es necesario que nos ocupemos manualmente de las variables…

Ejemplo de uso de la recursión en una función:


<?php
function comprobarEntero($numero){
if (
$numero > 1 ){
return
comprobarEntero($numero-1);
} elseif (
$numero < 0){
return
comprobarEntero((-1)*$numero-1 ;
} else {
if (
$numero > 0  &amp;&amp;  $numero < 1) return "No";
else return
"Si";
}
}

echo "Es 0 un entero?".comprobarEntero(0)."<br>";
echo
"Es 7 un entero?".comprobarEntero(7)."<br />";
echo
"Es 2.7 un entero?".comprobarEntero(2.7)."<br />";
echo
"Es -7 un entero?".comprobarEntero(-7)."<br />";

?>


Llamadas dinámicas a funciones
Puede que no sepas qué función llamar cuando estás escribiendo un script de PHP, posiblemente sea porque los datos en los que te bases determinen qué hacer durante la ejecución, una forma de llevar esto a cabo es establecer una variable con el nombre de una función y después usarla como si fuera una función.
Si a una variable le sigue un paréntesis se interpreta de esta forma, se tratará como una función, veamos un ejemplo:


<?php
function mostrar($texto)
{
echo
$texto;
}
function
mostrarNegrita($texto){
echo
‘<b>'.$texto.‘</b>';
}
$miFuncion = ‘mostrar';
$miFuncion("Hola!").‘<br />';
$miFuncion = ‘mostrarNegrita';
$miFuncion("Hola en negrita!").‘<br />';

?>


Si no sabes exactamente como funcionará exactamente puedes crear una función anónima por medio de la función "create_function".

Funciones definidas por el usuario
La función "create_function" crea una función y devuelve un nombre único, por eso son funciones anónimas, eso permite escribir funciones que dependen de información sólo disponible en tiempo de ejecución, aunque puedes almacenar el nombre de esta nueva función en una variable para lalmarla después, create_function es quizás el método más útil para definir funciones de tipo lambda, ejemplo:


<?php
$datos  
= array("zanahoria","manzana","naranja");
//añade subrayado bajo al final de cada palabra y convertir todo a mayúsculas:
array_walk($datos, create_function(‘&amp;$v',
‘$v = "_".strtoupper($v)."_";')
);
print_r($datos);

?>



Puedes crear y usar tus propias funciones con "call_user_func($nombre_funcion,…)", ejecuta una función definida por el usuario, donde "…" a continuación son los argumentos a pasar a dicha función en tiempo de ejecución. Puedes usarla para llamar a un método de un objeto ,entonces en lugar de un nombre usa un array donde el primer argumento es el objeto donde reside el método y el segundo el nombre de la función,ahi termina el array, el resto igual que antes…

call_user_func_array($funcion, $array_de_parametros ) es igual que call_user_func excepto porque hay un array de parámetros en lugar de varios argumentos.

Un método no recomendado es eval(), intenta ejecutar el argumento pasado, que es código PHP, ejemplo:


<?php
$codigo
= ‘<b>< ?php print(date("d-m-Y"));?></b>';
eval (
"?>".$codigo);

?>


Y hasta aquí sobre funciones, seguid leyendo el código de zenphp para ver más ejemplos complejos.

Acelerando Wordpress : plugins que usan los aceleradores PHP

Escrito el 20/Marzo/2008 por juan_belon

Si estás interesado en acelerar tu rendimiento en WordPress hasta el límite conocido, no necesitas buscar más. XCache par a WordPress integra tu instalación de WordPress con el almacenamiento dinámico de XCache, acelerando así el rendimiento y mejorando la fiabilidad bajo alta carga en el servidor.

Leer el resto del artículo »

Plugin iManage - Imágenes en tu editor HTML online

Escrito el 14/Febrero/2008 por juan_belon

iManage es un plugin para insertar imágenes en los editores HTML [con AJAX] de formularios web, en mi caso uso tinyMCE.

Puedes descargar el fichero traducido al español por mi aquí.

Errores de principiante

Escrito el 01/Febrero/2008 por juan_belon

Recordar que, los ficheros PHP al guardarlos no had de dejar un espacio al final o mostrar ninguna salida ya que las sesiones no se pueden crear si los hay (estos espacios aunque sea uno), ya que se envia el bufer de salida de php al navegador y las cabeceras que se mandan al inicio incluyen la sesión y tienen que ser las primeras con la llamada session_start().

Para eso los editores buenos se encargan de mantenerlos a raya ;D

Equilibrando la carga de procesamiento

Escrito el 30/Enero/2008 por juan_belon

A veces deberemos hacer más consultas que procesamiento y otras veces es al revés, por eso debemos conocer los mecanismos equivalentes como instrucciones tanto para PHP como para mySQL o cualquier otro motor de base de datos.
Ejemplo, si necesitamos construir una tabla, un listado que extraemos de una serie de tuplas de una consulta de la base de datos ,pero sólo queremos mostrar del campo título ,digamos unos 20 ó 30 caracteres, en lugar de seleccionar todas las tuplas que podrían ser miles, y tienen cada una 250…y después recortar la cadena con substr() de PHP, lo que hacemos es seleccionar sólo esos 20 ó 30 caracteres desde la base de datos con una instrucción mejorada de mySQL: "SELECT SUBSTRING(campo, 1,20) as campo from tabla" o bien SELECT SUBSTRING(campo, 1,30) o cualquier otra subcadena, recortando el texto en el motor de base de datos lo hace más eficiente y carga menos el buffer. Observar que se empieza con 1 y no con 0 (por si os da quebraderos de cabeza…)

Saludos.
(keep up the good code!!=)

Usando el sistema de memoria con PHP

Escrito el 25/Enero/2008 por juan_belon

PHP ofrece una extensión para usar el sistema de memoria de System V de S.O. tipo Unix, GNU/Linux, Solaris, etc a través de llamadas al sistema ,estamos hablando de semáforos.

La memoria compartida es memoria virtual compartida por procesos separados. Ayuda a solventar problemas de comunicación entre procesos ejecutándose en la misma máquina. Un método obvio debería ser escribir información en un fichero, pero el acceso a un medio permanente es relativamente lento. La memoria compartida permite la creación de memoria de sistema que pueda ser accedida por múltiples procesos, lo que es mucho más rápido. Como el uso exclusivo de la memoria es esencial, se debe usar un orden de bloqueo. Esto se suele hacer con semáforos. Si se usan las funciones de memoria compartida primero tenemos que asegurarnos de que se incluye el soporte de semáforos de System V.

Una discusión completa del uso de las funciones de memoria compartida se encuentra en http://www.whatis.com

La función integer_shm_attach(integer key, integer size, integer permissions) fue añadida por Christian Cartus. (thank you)

Un ejemplo:


<?php
/**
* Este ejemplo usa un semáforo para usar la
* memoria compartida para comunicarse
* entre múltiples procesos.
* Para liberar la memoria creada se debe
* de usar shm_remove
*/

//definir las llaves enteras de los semáforos
define(‘SEM_GRANADA_PHP',1970);
// la memoria compartida (MC):
define(‘MC_GRANADA_PHP',1970);
//llave para la variable:
define(‘MC_MENSAJE',1970);

//Obtener o crear el semáforo
$sem = sem_get(SEM_GRANADA_PHP,1);
//sólo se puede obtener una vez:
if (sem_acquire($sem))
{

//asociar a la memoria:
$mem = shm_attach(MC_GRANADA_PHP,1024);
//Hacemos que entre en un KiloByte.
//Obtenemos el mensaje:
if ($anterior_mensaje = shm_get_var($mem, MC_MENSAJE)){
echo
"Valor anterior: $anterior_mensaje &lt;br&gt;\n";
}
//crear nuevo mensaje:
$nuevo_mensaje = getmypid()." aqui a las ".microtime();
//poner el nuevo valor:
shm_put_var($mem, MC_MENSAJE, $nuevo_valor);
//desasociar de la memoria compartida:
shm_detach($mem);
//liberar el semáforo:
sem_release($sem);
}
else {
echo
"No se pudo obtener el semáforo!";

}

?>


shm_remove:


<?php
//Con las mismas constantes
//obtenemos el semáforo:
$sem = sem_get(SEM_GRANADA_PHP, 1);
if (
sem_acquire($sem)){
//añadir a la memoria compartida
$mem = shm_attach($mem, MC_MENSAJE);
//quitar la memoria compartida:
shm_remove($mem);
//borrar el semáforo:
sem_release($sem);
} else {
echo
"No se pudo obtener el semáforo!";
}

?>


Dias entre dos fechas

Escrito el 09/Enero/2008 por juan_belon

La versión más resumida que he podido crear de la función:


<?php
/**
* Calcula la diferencia entre dos fechas y devuelve el número de dias resultante:
* Pasar las fechas como cadenas en el formato: date('d/m/Y')
*
* @param str $fecha_ini
* @param str $fecha_fin
* @return str
*/
function zen_comparaFechas ($fecha_ini, $fecha_fin){
//Inicialización
$matriz_f_ini = explode ("/", $fecha_ini);
$matriz_f_fin = explode ("/", $fecha_fin);
//Cálculo
return gregoriantojd($matriz_f_fin[1], $matriz_f_fin[0], $matriz_f_fin[2]) - gregoriantojd($matriz_f_ini[1], $matriz_f_ini[0], $matriz_f_ini[2]);
}

?>


« Entradas anteriores