PHP: magia con los arreglos

Por algunas horas estuve muy arrepentido de no haber estado en las clases de programacion en C en la universidad(venia de otra U, asi que la convalide y “decidi” no entrar de oyente y perder el tiempo por ahi…estudiando calculo integral xq estaba en panga).

Hoy realmente lo necesite: tenia una situacion en PHP y la solucion claramente en hacer un algoritmo que de una lista de cadenas de “strings” extrajera los valores unicos(todos los no repetidos, y los repetidos solo 1 vez; estilo MySQL DISTINCT).

Mi cabeza penso y solo encontro un “vacio” en la seccion de “algoritmos basicos de programacion’…muy, muy arrepentido .

Lo primero que hice fue “inventar” el algoritmo con una vieja favorita: la prueba de escritorio.  De acuerdo a mi parecer, el algoritmo que probe en papel estaba bueno, pero cuando fui a programarlo en vez de extraer una lista de valores unicos, duplico y triplico hasta los miles la cantidad de valores…que paso ahi? No tengo idea; y no tengo tiempo para averiguarlo xq tengo que terminar este task!

Afortunadamente, hay dos(2) funciones en PHP que me “sacaron del hoyo” en esta ocasion:

array_unique es una funcion que retorna un nuevo arreglo con todos los valores unicos de un arreglo de valores repetidos.

ejemplo:

Screen Shot 2013-04-01 at 1.14.54 AM

Tiene tres elementos importantes:

los compara como “strings”

la condicion es esta: si $string1 === $string2 , guarda el $string1 en el nuevo arreglo(es decir, siempre agarra la primera instancia que encuentra del valor, aunque se repita mas adelante en el arreglo)

mantiene los indices/llaves originales: esto es SUPER importante recordarlo porque si los valores son 3,6,8,32,44,54,64 asi mismo te los guarda en el arreglo nuevo, tiempo de $array[54] = “string!”;

Si necesitas que los indices esten en orden de nuevo (tipo 0,1,2,3…) tienes que hacer un truco mas…

para mi caso en particular, necesitaba el segundo truco, porque no me gustan los indices en desorden(y te “hacen perder tiempo” si quieres recorrer el arreglo).

El segundo truco viene con la funcion array_values : esta funcion te retorna un arreglo con los “valores” del arreglo original, en una lista(o arreglo, no se) consecutiva(es decir, con indices 0,1,2,3…)

ejemplo:

array_values

con esta, ya tienes un arreglo con los valores unicos, y ademas ordenados.

Encontrar estas funciones me ha salvado y ojala te ayuden a ti tambien mas adelante.  En PHP hay muchisimas funciones para muchisimas cosas que quizas solo son relevantes un par de veces en la vida, pero hay que estar agradecido de que Lerdorf y el quipo de PHP pensaron en muchas, muchas posibilidades :D

Anuncios

Mysql…Foreign Key error(150) —algunas precauciones

Es una gran pesadilla intentar hacer llaves foraneas(foreign keys) entre algunas tablas en MySQL y que siempre te salga el bendito: ‘err(150)’, que en realidad no significa nada; es un mensaje de “error general”.  Pelicula de Terror.

Me acaba de suceder, y tanto buscando en internet como pensando un poco(nunca pasa de moda), al final pude hacer las relaciones que necesitaba.  Aqui les dejo una lista de elementos a considerar cada vez que la pesadilla llamada err(150) frustre tus intenciones de “hacer que las tablas se agreguen unas a otras en sus listas de amigos del Mysql Space“:

  • Verifica tipo de dato/tamanio del campo: es lo mas logico, puesto q la misma informacion iria en ambos campos
  • Ambas tablas que sean de motor InnoDB(debe ser asi en primera instancia, para que haya llaves foraneas)
  • Campos tipo BLOB y TEXT no pueden ser llaves foraneas: no hay garantias de que a nivel de bits la informacion se mantenga igual en todos los casos; de modo que mejor abandona y ponte a normalizar e inventa tablas y campos que si puedas enlazar
  • Verifica los “collation”: el collation debe ser el mismo tambien, sino los caracteres pueden malformarse en la relacion, y por lo tanto Mysql no te deja enlazarlas
  • si ya tienes registros en las tablas que ‘alimentan’ a la tabla madre, el campo de la tabla ‘madre’ debe coincidir con los datos de la tabla que alimenta.  Ejemplo:

tienes la tabla “TipoCaballo” que alimenta a la tabla madre “CaballosAlquilados”.  Los registros de la tabla madre, en el campo “CaballosAlquilados.idTipoCaballo” deben tener un valor que corresponda a cualquiera de los que tenga la tabla “TipoCaballo” en su campo “idTipoCaballo”.  Esto debe ser asi incluso antes de hacer la relacion, si no va a enviarte el error de que los datos no coinciden, por lo tanto no puede haber relacion.

Creo que son todas las que utilice para resolver mis asuntos.  Espero que les sirvan, y en tal caso aporten mas DATITOS! para erradicar la tragedia de los err(150) de este mundo!

Tutorial507 No.1: Abrir Puerto SSH en La Fonera con firmware 0.7.1.r5!!!

Es posible muchachos. UNA VEZ MAS TECNOPATA507 DEMUESTRA QUE ERA POSIBLE abrir ssh en una fonera con el ultimo firmware 0.7.1.r5; algo que, hasta donde teniamos entendido era poco probable. Hemos salvado el mundo, una vez más(psss, eso si estuvo pasado.) Sigue leyendo