Mes: marzo 2017
Identificar a un usuario aunque use navegadores diferentes
Funciones esMagico y crearCuadrado
function cuadrado_magico($ancho) {
if ($ancho % 2 == 0)
$ancho--;
$posy = 0;
$posx = floor($ancho / 2);
$cont = 1;
while ($cont <= $ancho ** 2) {
if (empty($c[$posy][$posx])) {
$c[$posy][$posx] = $cont++;
$posx = ($posx + 1) % $ancho;
$posy = ($posy - 1 + $ancho) % $ancho;
} else {
$posx = ($posx - 1 + $ancho) % $ancho;
$posy = ($posy + 2) % $ancho;
}
}
return $c;
}
function esMagico($t) {
//Sumo la primera fila para tener un valor de referencia
$sum = array_sum($t[0]);
$sd1 = 0;
$sd2 = 0;
for ($i = 0; $i < count($t); $i++) {
$sf = 0;
$sc = 0;
$sd1 += $t[$i][$i];
$sd2 += $t[$i][count($t) - 1 - $i];
for ($j = 0; $j < count($t[$i]); $j++) {
$sf += $t[$i][$j]; //Sumo la fila
$sc += $t[$j][$i]; //Sumo la columna
}
//Si fila o columna son diferentes al valor de referencia no es mágico
if ($sf != $sum || $sc != $sum) {
return false;
}
}
return !($sd1 != $sum || $sd2 != $sum);
}
Funciones de arrays (VI)
Funciones para mezclar o comparar arrays:
Funciones de suma y producto:
Funciones de mezcla de variables y array:
Pasar una función a cada elemento del array:
Ejemplo de este último:
$frutas = array("d" => "limón", "a" => "naranja", "b" => "banana", "c" => "manzana");
function test_alter(&$elemento1, $clave, $prefijo)
{
$elemento1 = "$prefijo: $elemento1";
}
function test_print($elemento2, $clave)
{
echo "$clave. $elemento2
\n";
}
echo "Antes ...:\n";
array_walk($frutas, 'test_print');
array_walk($frutas, 'test_alter', 'fruta');
echo "... y después:\n";
array_walk($frutas, 'test_print');
Función esMagico
function esMagico($t){
$sum=0;
//Sumo la primera fila para tener un valor de referencia
for ($i=0;$i<count($t[0]);$i++){
$sum+=$t[0][$i];
}
for ($i=0;$i<count($t);$i++){
$sf=0;
$sc=0;
for ($j=0;$j<count($t[$i]);$j++){
$sf+=$t[$i][$j]; //Sumo la fila
$sc+=$t[$j][$i]; //Sumo la columna
}
//Si fila o columna son diferentes al valor de referencia no es mágico
if ($sf!=$sum || $sc!=$sum ){return false;}
}
return true;
}
Funciones para convertir un array bidimensional en html
function array_to_table($tabla) {
$res = "<table border=1>";
for ($i = 0; $i < count($tabla); $i++) {
$res .= "<tr>";
for ($j = 0; $j < count($tabla[$i]); $j++) {
$res .= "<td>" . $tabla[$i][$j] . "</td>";
}
$res .= "</tr>";
}
$res .= "</table>";
return $res;
}
function array_to_table2($tabla) {
$res = "<table border=1>";
foreach ($tabla as $n) {
$res .= "<tr>";
foreach ($n as $el) {
$res .= "<td>" . $el . "</td>";
}
$res .= "</tr>";
}
$res .= "</table>";
return $res;
}
Arrays multidimensionales
En PHP los arrays multidimensionales se crean con arrays dentro de arrays:
function muestraTabla($tabla) {
echo "<pre>";
print_r($tabla);
echo "</pre>";
}
$m=array(
array(1,2),
array(3,4),
);
muestraTabla($m);
for($i=0;$i<count($m);$i++){
for ($j=0;$j<count($m[$i]);$j++){
echo $m[$i][$j]."<br/>";
}
}
foreach ($m as $n){
foreach ($n as $el){
echo $el."<br/>";
}
}
Podemos tener las dimensiones que queramos:
$m = array(
array(
array(0, 1),
array(2, 3)
),
array(
array(4, 5),
array(6, 7)
),
array(
array(8, 9),
array(10, 11)
),
);
muestraTabla($m);
for ($i = 0; $i < count($m); $i++) {
for ($j = 0; $j < count($m[$i]); $j++) {
for ($k = 0; $k < count($m[$i][$j]); $k++) {
echo $m[$i][$j][$k] . "<br/>";
}
}
}
foreach ($m as $n) {
foreach ($n as $el) {
foreach ($el as $e) {
echo $e . "<br/>";
}
}
}
Lo mismo que usamos para recorrer lo podemos usar para generar:
for ($i = 0; $i < 10; $i++) {
for ($j = 0; $j < 10; $j++) {
$m[$i][$j]=$j+$i*10;
}
}
muestraTabla($m);
Un array puede ser cualquier combinación de valores, asociativos, arrays dentro de arrays dentro de arrays….
$tablaLoca = array(
"juan",
"pepe" => array(1, 2, 3),
array(
array("a","b"),
"w"
),
5,
"ppp"=>array(
"q"=>3,
"w"=>array(1,2,array(7,8))
)
);
muestraTabla($tablaLoca);
Si quisiéramos acceder a los valores de una tabla como la anterior necesitaríamos una función recursiva:
function valores($var){
$res="";
if (is_array($var)){
foreach($var as $v){
$res.=valores($v);
}
}
else{
$res=$var.",";
}
return $res;
}
echo valores($tablaLoca);
Ordenar por funciones propias
Con usort(), uasort() y uksort() podemos ordenar por funciones propias. Esto nos da mucha flexibilidad a la hora de ordenar. Ejemplos:
function muestraTabla($tabla) {
echo "<pre>";
print_r($tabla);
echo "</pre>";
}
function miOrden($a, $b) {
$la = strlen($a);
$lb = strlen($b);
return $la < $lb ? -1 : 1;
}
function acentos($name1, $name2) {
$patterns = array(
'a' => '(á|à|â|ä|Á|À|Â|Ä)',
'e' => '(é|è|ê|ë|É|È|Ê|Ë)',
'i' => '(í|ì|î|ï|Í|Ì|Î|Ï)',
'o' => '(ó|ò|ô|ö|Ó|Ò|Ô|Ö)',
'u' => '(ú|ù|û|ü|Ú|Ù|Û|Ü)',
'n '=>'(ñ)'
);
$name1 = preg_replace(array_values($patterns), array_keys($patterns), $name1);
$name2 = preg_replace(array_values($patterns), array_keys($patterns), $name2);
return strcasecmp($name1, $name2);
}
$array1 = array("no", "ño", "na", "ña","ánimo","oído","ópera","nzuelo");
usort($array1,'miOrden');
muestraTabla($array1);
usort($array1,'acentos');
muestraTabla($array1);
Ejercicio pares impares y lista
function muestraTabla($tabla) {
echo "<pre>";
print_r($tabla);
echo "</pre>";
}
$numeros = array(2, 56, 3, 765, 4, 8, 90, 99, 23);
foreach ($numeros as $n) {
if ($n % 2 == 0) {
$pares[] = $n;
} else {
$impares[] = $n;
}
}
muestraTabla($pares);
muestraTabla($impares);
function elementosLista($cadena){
$tabla=explode("</li>",$cadena);
array_pop($tabla);
foreach($tabla as $c=>$v){
$tabla[$c]=strip_tags($v);
}
return $tabla;
}
function elementosListaMejor($cadena){
$cadena= strip_tags(str_replace("</li><li>", "~", $cadena));
$tabla=explode("~",$cadena);
return $tabla;
}
$cad="<ul><li>hola</li><li>que</li><li>tal</li></ul>";
$t=elementosListaMejor($cad);
muestraTabla($t);
Ejemplos funciones de cadena
function eliminaVocalesLargo($cadena){
$cadena= str_ireplace("a", "#", $cadena);
$cadena= str_ireplace("e", "#", $cadena);
$cadena= str_ireplace("i", "#", $cadena);
$cadena= str_ireplace("o", "#", $cadena);
$cadena= str_ireplace("u", "#", $cadena);
return $cadena;
}
function eliminaVocales($cadena,$char="#"){
$vocales="aeiou";
for ($i=0;$i<strlen($vocales);$i++){
$cadena= str_ireplace(substr($vocales,$i,1), $char, $cadena);
}
return $cadena;
}
function esVocal($cadena){
$vocales="aeiou";
return stripos($vocales,$cadena)!==false && strlen($cadena)==1;
}
function esVocal2($cadena){
$vocales="aeiou";
for ($i=0;$i<strlen($vocales);$i++){
if (substr($vocales,$i,1)==$cadena){
return true;
}
}
return false;
}
function contarVocales($cadena){
$cont=0;
for($i=0;$i<strlen($cadena);$i++){
if (esVocal(substr($cadena,$i,1))){
$cont++;
}
}
return $cont;
}
function masVocales(...$cadenas){
$a="";
foreach($cadenas as $c){
if (contarVocales($c)>contarVocales($a)){
$a=$c;
}
}
return $a;
}
function sortString($cadena){
$c=str_split( $cadena);
sort($c);
return implode('',$c);
}
function ordenar($cadena){
$vocales="";
$consonantes="";
for($i=0;$i<strlen($cadena);$i++){
$letra=substr($cadena,$i,1);
if (esVocal($letra)){
$vocales.=$letra;
}
else{
$consonantes.=$letra;
}
}
return sortString($vocales).sortString($consonantes);
}