Leer una web y extraer datos

  <?php

        function extrae($cadena, $inicio, $fin) {
            $pos = strpos($cadena, $inicio);
            if ($pos === false) {
                return "";
            }
            $pos2 = strpos($cadena, $fin, $pos + strlen($inicio));
            if ($pos2 === false) {
                return "";
            }
            return substr($cadena, $pos + strlen($inicio), $pos2 - $pos - strlen($inicio));
        }

        function extraeRegexp($cadena, $inicio, $fin) {
            preg_match_all('#' . $inicio . '(.*?)' . $fin . '#', $cadena, $matches);
            return $matches[1];
        }

        //Lee archivo y lo mete en un string
        $datos = file_get_contents("https://www.guiadelocio.com/teatro-y-danza");
        $pos = strpos($datos, "item-listado-AB");
        $items = [];
        while ($pos !== false) {
            $pos2 = strpos($datos, "</div>", $pos);
            $items[] = substr($datos, $pos, $pos2 - $pos);
            $pos = strpos($datos, "item-listado-AB", $pos + 1);
        }
        $fichero = fopen("teatro.csv", "a");
        foreach ($items as $item) {
            $titulo = strip_tags(extraeRegexp($item, 'alt="', '"')[0]);
            echo $titulo . "<br/>";
            $resto = strip_tags(extraeRegexp($item, '<p class="ubicacion">', '</p>')[0]);
            echo $resto . "<br/>";
            $resto = explode(",", $resto);
            print_r($resto);
            fwrite($fichero, utf8_decode(date("d-m-Y") . ";" . $titulo . ";" . 
                    $resto[0] . ";" . $resto[1] . "\n"));
        }
        fclose($fichero);
        //echo($datos);
        ?>

Funciones de ficheros

http://php.net/manual/en/ref.filesystem.php
https://www.w3schools.com/php/php_ref_filesystem.asp

 <?php
        $fichero=fopen("datos.txt","a");
        
        fwrite($fichero,"Lo que quiero que se escriba en el fichero\n");
        fwrite($fichero,"otra cosa");
        fclose($fichero);
        
        $fichero=fopen("tabla.txt","a");
        for($i=1;$i<=10;$i++){
            fwrite($fichero,$i." x 5 = ".($i*5)."\n");
        }
        fclose($fichero);
        
        $fichero=fopen("datos.txt","r");
        
        while(!feof($fichero)){
            $linea=fgets($fichero);
            echo $linea."<br/>";
        }
        
        fclose($fichero);
        ?>

Ejercicio equipos

Index:

 <h1>Página super guay</h1>
        Hola, dinos tu nombre para saber como dirigirnos hacia ti:
        <form action="panel.php">
            <input type="text" name="nombre">
            <input type="submit">
        </form>

Panel:

<?php
        session_start();
        require_once 'librerias.php';
        $nombre = filter_input(INPUT_GET, 'nombre', FILTER_SANITIZE_STRING);
        if (empty($nombre) && !isset($_SESSION['nombre'])) {
            ?>
            <h2>No has introducido ningún nombre. Por favor vuelve atrás.</h2>
            <a href="index.php">Vuelve atrás y pon un nombre ¡hombre!</a>
            <?php
        } else {
            if (!empty($nombre)) {
                $_SESSION['nombre'] = $nombre;
            } else {
                $nombre = $_SESSION['nombre'];
            }
            ?>
            <h1>Hola <?= $nombre ?>, bienvenido a la página superguay</h1>
            <a href="equipos.php">Introducir equipos</a><br/>
            <a href="resultados.php">Introducir resultados</a>
           <?php
            if (isset($_SESSION['equipos'])) {
                ?>
                <a href="resultados.php">Introducir resultados</a>
                <?php
                pintaEquipos($_SESSION['equipos']);
            }
            if (isset($_SESSION['equipos']) && isset($_SESSION['resultados'])) {?>
                <a href="resultados.txt">Descargar resultados</a>
                <?php
                muestraResultados($_SESSION['equipos'], $_SESSION['resultados']);
            }
        }
        ?>

equipos:

<h1>Introduzca los equipos separados por comas</h1>
        <form action="guardar_equipos.php">
            <input type="text" name="equipos" size="100">
            <input type="submit">
        </form>

guardar_equipos:

 <?php
        session_start();
        require_once 'librerias.php';
        // Recuperar los equipos que nos han mandado
        $equipos = filter_input(INPUT_GET, "equipos");
        // Si está vacío poner un aviso y enlace a equipos.php
        if (empty($equipos)) {
            ?>
            <h1>No has mandado equipos, inténtalo de nuevo</h1>
            <a href="equipos.php">Volver a equipos</a>
            <?php
        } else {
            //Si no está vacío convertir la lista de equipos en un array
            $tabla = explode(",", $equipos);
            //guardarlo en la variable de sesión equipos
            $_SESSION['equipos'] = $tabla;
            // Y mostrarlo como una tabla HTML
            pintaEquipos($tabla);
        }
        ?>
              <a href="panel.php">Volver al panel</a>

resultados:

<?php
        session_start();
        require_once 'librerias.php';
         if(isset($_SESSION['equipos'])){
             pintaResultados($_SESSION['equipos']);
            }
            else{
                ?>
        <h1>No hay equipos definidos, vuelva atrás</h1>
        <a href="panel.php">Volver atrás</a>
        <?php
            }
        ?>

guardar_resultados:

<?php
        session_start();
        
        require_once 'librerias.php';
        // Recuperar los resultados que nos han mandado
        $resultados = filter_input(INPUT_POST, 'resultado',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
        // Si está vacío poner un aviso y enlace a equipos.php
        if (empty($resultados)) {
            ?>
            <h1>No has mandado resultados, inténtalo de nuevo</h1>
            <a href="resultados.php">Volver a resultados</a>
            <?php
        } else {
            
            //guardarlo en la variable de sesión resultados
            $_SESSION['resultados'] = $resultados;
            // Y mostrarlo como una tabla HTML
            muestraResultados($_SESSION['equipos'],$_SESSION['resultados']);
  guardaResultados($_SESSION['equipos'],$_SESSION['resultados']);
        }
        ?>
              <a href="panel.php">Volver al panel</a>

librerias:

<?php

function pintaEquipos($tabla) {
    ?>
    <table>
        <tr><td>Equipos</td></tr>
        <?php foreach ($tabla as $valor) { ?>
            <tr><td><?= ucfirst($valor) ?></td></tr>
        <?php } ?>
    </table>
    <?php
}

function pintaResultados($tabla) {
    ?>
    <form action="guardar_resultados.php" method="post">
        <table>
            <tr><td>Resultados</td></tr>
            <?php for ($i = 0; $i < count($tabla); $i += 2) { ?>
                    <tr><!--<td><?php
                    echo $tabla[$i];
                    if (isset($tabla[$i + 1])) {
                        echo " - " . $tabla[$i + 1];
                    }
                    ?></td>-->
                    <td><?= $tabla[$i] . (isset($tabla[$i + 1]) ? " - " . $tabla[$i + 1] : "") ?></td>
                    <td><input type="text" name="resultado[]"></td>
                </tr>
            <?php } ?>
        </table>
        <input type="submit">
    </form>
    <?php
}

function muestraResultados($equipos,$resultados) {
    ?>

        <table>
            <tr><td>Resultados</td></tr>
            <?php for ($i = 0; $i < count($equipos); $i += 2) { ?>
                    <tr>
                    <td><?= $equipos[$i] . (isset($equipos[$i + 1]) ? " - " . $equipos[$i + 1] : "") ?></td>
                    <td><?=$resultados[$i/2]?></td>
                </tr>
            <?php } ?>
        </table>
     
    <?php
}
function guardaResultados($equipos, $resultados, $archivo = "resultados.txt",$tipo="w") {
    $fichero = fopen($archivo, $tipo);
    fwrite($fichero, "Resultados\n");
    for ($i = 0; $i < count($equipos); $i += 2) {
        fwrite($fichero, $equipos[$i] . (isset($equipos[$i + 1]) ? " - " . $equipos[$i + 1] : ""));
        fwrite($fichero, " : ".$resultados[$i / 2] . "\n");
    }
    fclose($fichero);
}

Recorrer arrays en php

Para recorrer un array normal podemos usar tanto un for normal como un foreach:

$t=[3,7,23,4];
for($i=0;$i<count($t);$i++){
    echo $t[$i]."-";
}
echo "<br/>";
foreach($t as $valor){
    echo $valor."-";
}

Para recorrer un array asociativo sólo podemos usar un foreach:

$a=["q"=>1,"w"=>2,"e"=>3];
foreach($a as $valor){
    echo $valor."-";
}

Ejemplos arrays en php

Mostrar una tabla con print_r y

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

Mostrar una tabla bidimensional en formato tabla de HTML:

function creaTabla($tabla) {
    ?><table><?php
        foreach ($tabla as $fila) {
            ?><tr><?php
                foreach ($fila as $valor) {
                    ?><td><?= $valor ?></td><?php }
                ?>
            </tr><?php }
    ?>
    </table><?php
}

Función que nos devuelve el elemento más frecuente de una tabla:

function frecuente($tabla) {
    $t = array_count_values($tabla);
    arsort($t);
    $res = [];
    $max = array_values($t)[0];
    foreach ($t as $clave => $valor) {
        if ($valor == $max) {
            $res[] = $clave;
        }
    }
    return $res;
}

Diagonales:

/*
 * Nos devuelve un array bidimensional del tamaño que le indiquemos
 * Relleno de ceros menos la diagonal principal que valdrá 1
 * Ejemplo: diagonal(3)
 *  1 0 0
 *  0 1 0
 *  0 0 1
 */
creaTabla(diagonal2(20));

function diagonal($tam) {
    $res = [];
    for ($i = 0; $i < $tam; $i++) {
        $res[$i] = array_fill(0, $tam, 0);
        $res[$i][$i] = 1;
    }
    return $res;
}

function diagonal2($tam) {
    $res = [];
    for ($i = 0; $i < $tam; $i++) {
        for ($j = 0; $j < $tam; $j++) {
            if ($i == $j) {
                $res[$i][$j] = 1;
            } else {
                $res[$i][$j] = 0;
            }
        }
    }
    return $res;
}

Ejemplos funciones con arrays


function calcetin($tabla) {
    $res = [];
    foreach ($tabla as $clave => $valor) {
        $res[$valor] = $clave;
    }
    return $res;
}

$t = ["a" => 1, "b" => 3, "c" => 1];
muestraTabla($t);
$c = calcetin($t);
muestraTabla($c);

function contar($tabla, $valor) {
    $cont = 0;
    foreach ($tabla as $v) {
        if ($valor == $v) {
            $cont++;
        }
    }
    return $cont;
}
echo esUnico1($t);
function esUnico1($tabla) {
    foreach ($tabla as $valor) {
        if (contar($tabla, $valor) > 1) {
            return false;
        }
    }
    return true;
}
function esUnico2($tabla) {
    $t = array_count_values($tabla);
    foreach ($t as $valor) {
        if ($valor > 1) {
            return false;
        }
    }
    return true;
}
function esUnico3($tabla){
    sort($tabla);
    for($i=1;$i<count($tabla);$i++){
        if ($tabla[$i]==$tabla[$i-1]){
            return false;
        }
    }
    return true;
}
function esUnico4($tabla){
    return count($tabla)==count(array_unique($tabla));
}

Ejemplo de función levenheist


echo masParecida("tomato", ["naranja","tomate","platano","morcilla"]);
echo masParecida("marnaja", ["naranja","tomate","platano","morcilla"]);
function masParecida($entrada, $palabras) {
// no se ha encontrado la distancia más corta, aun
$distancia = -1;
$cercana = "";
// bucle a través de las palabras para encontrar la más cercana
foreach ($palabras as $palabra) {
// calcula la distancia entre la palabra de entrada y la palabra actual
$lev = levenshtein($entrada, $palabra);
// verifica por una coincidencia exacta
if ($lev == 0) {
// la palabra más cercana es esta (coincidencia exacta)
return $palabra;
}
// si esta distancia es menor que la siguiente distancia
// más corta o si una siguiente palabra más corta aun no se ha encontrado
if ($lev <= $distancia || $distancia < 0) {
$cercana = $palabra;
$distancia = $lev;
}
}
return $cercana;
}

Funciones de cadena en PHP

Buscar una subcadena dentro de otra. Ejemplo ‘¿Tiene una cadena la @?’:

if (strpos($_POST['email'], '@') === false) {
print 'No hay arroba (@)';
}

Ponemos ‘===’ porque si la arroba está en la posición 0 se entiende como false.

El siguiente código nos devuelve el número de apariciones de una cadena en otra:

function contarCadena($pajar, $aguja) {
    $pos = strpos($pajar, $aguja);
    $cont = 0;
    while ($pos !== false) {
        $cont++;
        $pos = strpos($pajar, $aguja, $pos + 1);
    }
    return $cont;
}

Obtener subcadenas de una cadena. Ejemplo: ‘Obtener los cuatro primeros caracteres del código’.

$substring = substr($string,$start,$length);
$codigo='ABCD123456';
$parte=substr($codigo,0,4); //$parte='ABCD'
$parte=substr($codigo,4,4); //$parte='1234'
$parte=substr($codigo,4); //$parte='123456'
$parte=substr($codigo,-4); //$parte='3456'

Ejercicio: dada una cadena obtener otra con los dos primeros caracteres y los dos últimos.

Mayúsculas y minúsculas:

print ucfirst("how do you do today?"); //Primera letra
print ucwords("the prince of wales"); //primera letra de cada palabra
print strtoupper("i'm not yelling!"); //mayúsculas
print strtolower('<a href="one.php">one</a>'); // minúsculas

Partir cadenas con explode (por separador):

$cadena="hola que tal";
$palabras=explode($cadena); //Array ( [0] => hola [1] => que [2] => tal )
echo implode("-",$palabras);//hola-que-tal

Reemplazar una cadena por otra:

echo str_replace("a", "#", "hola que tal"); //hol# que t#l

Repetir una cadena:

echo str_repeat("|-|",6); //|-||-||-||-||-||-|

Funciones ajedrez y tabla


function ajedrez($tam) {
    ?>
    <table >
        <?php
        for ($i = 0; $i < $tam; $i++) {
            ?><tr><?php
                for ($j = 0; $j < $tam; $j++) {
                    ?><td class="<?= ($i + $j) % 2 == 0 ? "" : "dark" ?>"></td><?php }
                ?></tr><?php
        }
        ?>
    </table><?php
}

function tabla($tabla) {
    ?><table>
        <?php
        for ($i = 1; $i <= 10; $i++) {
            ?>
            <tr><td><?= $i ?></td><td>x</td><td><?= $tabla ?></td>
                <td>=</td><td><?= ($i * $tabla) ?></td></tr>
            <?php
        }
        ?>
    </table><?php
}

Ejemplos PHP

Árbol de un lado:

$cadena = "*";
        for ($i = 1; $i < 10; $i++) {
            echo $cadena . "<br/>";
            $cadena = $cadena . "*";
        }

Árbol de los dos lados:

        $tam=8;
        $cadena = "";
        echo "<pre>";
        for ($i = 0; $i < $tam; $i++) {
            for ($j = 0; $j < $tam - $i; $j++) {
                echo "&nbsp;";
            }
            echo $cadena . "*" . $cadena . "<br/>";
            $cadena .= "*";
        }
        echo "</pre>";

Árbol con bolas de navidad:

        $tam=8;
        $cadena = "";
        echo "<pre>";
        for ($i = 0; $i < $tam; $i++) {
            for ($j = 0; $j < $tam - $i; $j++) {
                echo " ";
            }
            for ($j = 0; $j < $i * 2 + 1; $j++) {
                if (rand(1, 10) == 7) {
                    echo "@";
                } else {
                    echo "*";
                }
            }
            echo "<br/>";
        }
        echo "</pre>";

Tablero de ajedrez, css:

td{
    width:50px;
    height:50px;
    background-color: linen;
    border: 1px solid #BBBBBB;
}
.dark{
    background-color: black;
}

php:

 <h1>Tablero de ajedrez</h1>
        <?php
        $tam = 8;
        ?>
        <table >
            <?php
            for ($i = 0; $i < $tam; $i++) {
                ?><tr><?php
                    for ($j = 0; $j < $tam; $j++) {
                        ?><td class="<?=($i+$j)%2==0?"":"dark"?>"></td><?php }
                    ?></tr><?php
            }
            ?>
        </table>