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; }
Árbol y tabla
$tam = 10; echo "<pre>"; for ($i = 0; $i < $tam; $i++) { echo str_pad(str_repeat("*", $i * 2) . "*", $tam * 2 + 1, " ", STR_PAD_BOTH) . "<br/>"; } $cad="*"; for ($i = 0; $i < $tam; $i++) { echo str_pad($cad, $tam * 2 + 1, " ", STR_PAD_BOTH) . "<br/>"; $cad.="**"; } ?> </pre> <table border="1"> <?php for ($i = 0; $i < $tam; $i++) { ?> <tr> <?php for ($j = 0; $j < $tam; $j++) { ?> <td><?=$j==$i || $j==$tam-1-$i?"1":" " ?></td> <?php } ?> </tr> <?php } ?></table>