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); }
Autor: Juan Pablo Fuentes
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); }
Funciones recursivas en PHP
Algunos ejemplos:
function factorial($numero) { if ($numero <= 1) { return 1; } else { return $numero * factorial($numero - 1); } } //Sería equivalente a lo siguiente: function factorial5() { return 5 * factorial4(); } function factorial4() { return 4 * factorial3(); } function factorial3() { return 3 * factorial2(); } function factorial2() { return 2 * factorial1(); } function factorial1() { return 1; } function fibonacci($n) { if ($n <= 2) { return 1; } else { return fibonacci($n - 1) + fibonacci($n - 2); } } function anagrama($cadena, $inicio = "") { //Si la longitud es uno, el anagrama es el mismo. Como es un nodo final imprimimos el resultado if (strlen($cadena) == 1) { echo $inicio . $cadena . "<br>"; return 1; } else { //Si no el anagrama será cada una de las letras más el anagrama del resto de la cadena //Le pasamos como parámetro la cadena de inicio que será la letra más lo que nos hayan //pasado como parámetro $c=0; for ($i = 0; $i < strlen($cadena); $i++) { $letra = substr($cadena, $i, 1); $c+=anagrama(substr($cadena, 0, $i) . substr($cadena, $i + 1), $inicio . $letra); } return $c; } }
Funciones con número variable de argumentos en PHP
Algunos ejemplos:
function suma(...$numeros) { $a = 0; foreach ($numeros as $n) { $a += $n; } return $a; } function mayor(...$numeros) { $a = $numeros[0]; foreach ($numeros as $n) { if ($n > $a) { $a = $n; } } return $a; } function masLarga(...$cadenas) { $a = ""; foreach ($cadenas as $c) { if (strlen($c) > strlen($a)) { $a = $c; } } return $a; }