PHP: Array 2 JSON

Author: Adrià Cidre  |  Category: PHP

Genial función en PHP que transforma un array PHP en una salida tipo Json. Genial para PHP4 que no integraba esta funcionalidad de serie.


function array2json($arr) {
  if(function_exists('json_encode')) return json_encode($arr); //Lastest versions of PHP already has this functionality.
  $parts = array();
  $is_list = false; 

  //Find out if the given array is a numerical array
  $keys = array_keys($arr);
  $max_length = count($arr)-1;
  if(($keys[0] == 0) and ($keys[$max_length] == $max_length)) {//See if the first key is 0 and last key is length - 1
      $is_list = true;
      for($i=0; $i$value) {
      if(is_array($value)) { //Custom handling for arrays
          if($is_list) $parts[] = array2json($value); /* :RECURSION: */
          else $parts[] = '"' . $key . '":' . array2json($value); /* :RECURSION: */
      } else {
          $str = '';
          if(!$is_list) $str = '"' . $key . '":'; 

          //Custom handling for multiple data types
          if(is_numeric($value)) $str .= $value; //Numbers
          elseif($value === false) $str .= 'false'; //The booleans
          elseif($value === true) $str .= 'true';
          else $str .= '"' . addslashes($value) . '"'; //All other things
          // :TODO: Is there any more datatype we should be in the lookout for? (Object?) 

          $parts[] = $str;
      }
  }
  $json = implode(',',$parts); 

  if($is_list) return '[' . $json . ']';//Return numerical JSON
  return '{' . $json . '}';//Return associative JSON
}

PHP: Contraseña aleatoria

Author: Adrià Cidre  |  Category: MiniCodes, PHP

Cuando damos de alta usuarios de forma automática a menudo necesitamos poner una contraseña por defecto. Este script PHP nos devuelve una contraseña aleatoria de la longitud en caracteres que le pasemos


function getRandomPWD($length = 10){
  $password = "";
  $possible = "0123456789bcdfghjkmnpqrstvwxyz";
  $i = 0; 

  while ($i < $length) {
    $char = substr($possible, mt_rand(0, strlen($possible)-1), 1);

    if (!strstr($password, $char)) {
      $password .= $char;
      $i++;
    }
  }
  return $password;
}

Código original

PHP – Diferencia entre dos fechas

Author: Adrià Cidre  |  Category: MiniCodes, PHP

Bueno pues igual que en javascript, aquí tenéis la función PHP para calcular los días/noches de diferencia entre dos fechas.


function dateDifference($d1, $d2){
	$v1 = explode("-", $d1);
  $date1 = mktime(0, 0, 0, intval($v1[1]), intval($v1[0]), intval($v1[2]));

	$v2 = explode("-", $d2);
  $date2 = mktime(0, 0, 0, intval($v2[1]), intval($v2[0]), intval($v2[2]));

  $dateDiff = $date2 - $date1;

  return floor($dateDiff/(60*60*24));
}

Javascript – Diferencia entre dos fechas

Author: Adrià Cidre  |  Category: Java Script, MiniCodes

Ahora mismo estoy desarrollando una aplicación para un hotel en la que el usuario tiene que seleccionar dos fechas, y hay que calcular la diferencia entre las dos para obtener el número de noches que se va a alojar.

Solo tenéis que utilizar esta función javascript, que os devolverá un entero con el numero de noches.

function getNumeroDeNits(){
	var d1 = $('#datepicker1').val().split("-");
	var dat1 = new Date(d1[2], parseFloat(d1[1])-1, parseFloat(d1[0]));
	var d2 = $('#datepicker2').val().split("-");
	var dat2 = new Date(d2[2], parseFloat(d2[1])-1, parseFloat(d2[0]));

	var fin = dat2.getTime() - dat1.getTime();
	var dias = Math.floor(fin / (1000 * 60 * 60 * 24))  

	return dias;
}

Esta claro que en html deberíais tener dos campos llamados datepicker1 y datepicker2, con el formato de fecha dd-mm-aaaa.

JQUERY – Scroll top

Author: Adrià Cidre  |  Category: Java Script, MiniCodes

Bueno después de un tiempo sin publicar a ver si nos ponemos las pilas de nuevo :-) .

Cuando desarrollas webs de una sola pagina en las que muestras un contenido u otro en javascript, a menudo queda un poco tosca la transición entre un contenido y otro, lo mejor es hacer un scroll hasta arriba de la pagina y no hay manera más estética de hacerlo que mediante este trozo de código en jquery.

$('html, body').animate({scrollTop:0}, 'slow')

Espero que os guste y os sirva.

Javascript: Subir Imagenes con AJAX

Author: Adrià Cidre  |  Category: PHP

Mirando en the Bakery de CakePHP he encontrado una librería genial tanto para JQuery como para prototype, para cargar imagenes con AJAX.

Es francamente sencilla de utilizar, y además podemos conseguir unos acabados muy al estilo de web 2.0. eliminando de una vez por todas el input.file de toda la vida que a mi parecer es horroroso.

Podéis encontrar el articulo original aquí.

PHP: Enviar post a Twitter

Author: Adrià Cidre  |  Category: PHP

Os dejo una función para enviar mensajes a Twitter desde PHP.


function tweet($message, $username, $password)
{
  $context = stream_context_create(array(
    'http' => array(
      'method'  => 'POST',
      'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
                   "Content-type: application/x-www-form-urlencoded\r\n",
      'content' => http_build_query(array('status' => $message)),
      'timeout' => 5,
    ),
  ));
  $ret = file_get_contents('http://twitter.com/statuses/update.xml', false, $context);

  return false !== $ret;
}

JQuery – Reset de un formulario

Author: Adrià Cidre  |  Category: Java Script, MiniCodes

A continuación se muestra como extender el núcleo de JQuery para poder hacer uso de la función reset() de un formulario en JQuery

	$.fn.extend({
		reset: function() {
	   	return this.each(function() {
				$(this).is('form') && this.reset();
	   	});
		}
	});

PHP: Aspectratio, redimension de imagenes al vuelo.

Author: Adrià Cidre  |  Category: PHP

Buenas a todos,

En uno de los comentarios de uno de los posts de este blog, Víctor nos comentaba como podía redimensionar imágenes con PHP, hace años que utilizo esta técnica, y personalmente la llamo aspectratio.

El script en cuestión recibe tres parámetros:

p: el path donde está la imagen original, puede ser una url o un fichero en el servidor.
w: el ancho máximo que queremos que tenga la imagen final
h: el alto máximo que queremos que tenga la imagen final.


$datos = getimagesize($nombre);
if($datos[2]==1){$img = @imagecreatefromgif($nombre);}
if($datos[2]==2){$img = @imagecreatefromjpeg($nombre);}
if($datos[2]==3){$img = @imagecreatefrompng($nombre);} 

$ratio = ($datos[0] / $anchura);
$altura = ($datos[1] / $ratio); 

if($altura>$hmax){$anchura2 = $hmax*$anchura/$altura;$altura=$hmax;$anchura=$anchura2;}
$thumb = imagecreatetruecolor($anchura,$altura); 

if($datos[2]==1)
	{
	$trnprt_indx  = imagecolortransparent($img);
	$trnprt_color = imagecolorsforindex($img, $trnprt_indx);
	$trnprt_indx  = imagecolorallocate($thumb, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);

	imagefill($thumb, 0, 0, $trnprt_indx);
	imagecolortransparent($thumb, $trnprt_indx);
	}
elseif ($datos[2]==3)
	{
	imagealphablending($thumb, false);
	$color = imagecolorallocatealpha($thumb, 0, 0, 0, 127);
	imagefill($thumb, 0, 0, $color);
	imagesavealpha($thumb, true);
	}

imagecopyresampled($thumb, $img, 0, 0, 0, 0, $anchura, $altura, $datos[0], $datos[1]); 

if($datos[2] == 1){header("Content-type: image/gif"); imagegif($thumb);}
if($datos[2] == 2){header("Content-type: image/jpeg"); imagejpeg($thumb);}
if($datos[2] == 3){header("Content-type: image/png"); imagepng($thumb); } 

imagedestroy($thumb); 

Este script escupe por pantalla la imagen, con lo que podemos llamarla para que nos convierta imágenes al vuelo.

Esta es una opción muy válida si no tienes acceso a instalar librerías en tu hosting. Si puedes hacerlo, deberías echarle un ojo a ImageMagick que ofrece unos resultados infinitamente mejores que no la librería GD (más extendida en hostings).

Javascript – Crear un Bookmark

Author: Adrià Cidre  |  Category: Java Script

Bueno como no podia ser de otra manera, Firefox, IE y Opera se lo montan diferente a la hora de gestionar los bookmarks, por lo que será necesario la siguiente función para poder crear un enlace que nos permita añadir un bookmark en cualquiera de los tres navegadores anteriores.


function CreateBookmarkLink(title, url) {
	if (window.sidebar) { // Mozilla Firefox Bookmark
		window.sidebar.addPanel(title, url,"");
	} else if( window.external ) { // IE Favorite
		window.external.AddFavorite( url, title); }
	else if(window.opera && window.print) { // Opera Hotlist
		return true; }
 }