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>