Ejercicio palabras mal escritas

 <style>
 .celdako,.celdaok{
 cursor: pointer;
 width:100px;
 height:50px;
 text-align: center;
 }
 .celdaok:active {
 background-color:lightgreen;
 
 }
 .celdako:active {
 background-color: red;
 }

 </style>

<?php

 function muestraTabla($tabla) {
 echo "<pre>";
 print_r($tabla);
 echo "</pre>";
 }

 $palabras = array(
 array('length', array('lenght', 'legnth', 'langth', 'lentgh', 'lenhgt')),
 array('locomotion', array('lomocotion', 'lotocomion', 'molocotion', 'locamotion', 'locomocion')),
 array('bedroom', array('vedroom', 'bedrum', 'berdoom', 'bedrun', 'bedroon', 'beddroom')),
 array('coin', array('coyn', 'cony', 'cain', 'con')),
 array('stable', array('estable', 'stoble', 'stabel', 'tsable')),
 array('crush', array('cruhs', 'clush', 'cruss', 'crusah')),
 array('fantasy', array('fantasi', 'fantascy', 'fatnasy', 'frantasy')),
 array('pillow', array('pellow', 'pillou', 'pilluw', 'pilow', 'pilou')),
 );

 function array_to_table($tabla, $buena,$ancho=2) {
 $res = "<table border=1>";
 for ($i = 0; $i < count($tabla); $i++) {
 if ($i % $ancho == 0) {
 $res .= "<tr>";
 }
 $res .= '<td class="' . ($tabla[$i] == $buena ? 'celdaok' : 'celdako') . '">' . $tabla[$i] . "</td>";
 if ($i % $ancho == $ancho-1) {
 $res .= "</tr>";
 }
 }
 $res .= "</table>";
 return $res;
 }

 //Seleccionar una palabra al azar rand (0,count($palabras)-1)

 $palabra = $palabras[rand(0, count($palabras) - 1)];
 // muestraTabla($palabra);
 //Coger la palabra buena y seleccionar tres palabras malas al azar
 $tablero[] = $palabra[0];
 // $malos = $palabra[1];

 //shuffle($malos);
 //$malos=array_slice($malos, 0, 8);
 $tablero = array_merge($tablero, $palabra[1]);
 while (count($tablero)<9){
 $a=$palabras[array_rand($palabras)];
 
 $palazar=$a[1][array_rand($a[1])];
 if (!in_array($palazar, $tablero)){
 $tablero[]=$palazar;
 }
 }
 // muestraTabla($tablero);
 //Mezclar
 shuffle($tablero);
 //Y mostrar
 echo array_to_table($tablero, $palabra[0],3);
 ?>

Ejemplo validación

 <form >
 <div class="form-group">
 <label for="s1">Sumando 1:</label>
 <input type="text" class="form-control" name="s1" >
 </div>
 <div class="form-group">
 <label for="s2">Sumando 2:</label>
 <input type="number" class="form-control" name="s2" required="">
 </div>
 
 <input type="submit" value="Manda los datos">
 </form> 
 <?php
 $s1= filter_input(INPUT_GET,'s1',FILTER_VALIDATE_INT);
 $s2= filter_input(INPUT_GET,'s2',FILTER_VALIDATE_INT);
 echo "La suma es: ".($s1+$s2);

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:

array_diff()

array_intersect()

array_merge()

array_unique()

Funciones de suma y producto:

array_sum()

array_product()

Funciones de mezcla de variables y array:

compact()

list()

Pasar una función a cada elemento del array:

array_walk()

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);