« Ritorna al blog

Ritorna alla lista completa degli articoli

Mettiti alla prova: lettura di un file json

PHP - SFIDE - febbraio 17, 2022

In questo esercizio dovrai riuscire ad estrapolare dei dati da un file in formato json. Il file contiene nove frasi motivazionali. Lo scopo dell'esercizio è visualizzare i dati in una lista e sorteggiare a caso una frase del giorno ogni volta che l'utente accede nuovamente alla pagina. Per prima cosa bisogna creare il file con formato *.json e copiare il seguente contenuto:

posts.json

[
    {
        "Id": 1,
        "Autore": "Lev Tolstoj",
        "Testo": "I più forti tra tutti i guerrieri sono il tempo e la pazienza."
    },
    {
        "Id": 2,
        "Autore": "Mark Twain",
        "Testo": "I due giorni più importanti della vita sono il giorno in cui sei nato e il giorno in cui scopri il perché."
    },
    {
        "Id": 3,
        "Autore": "Wally Lamb",
        "Testo": "Il destino mescola le carte, ma siamo noi a giocare la partita."
    },
    {
        "Id": 4,
        "Autore": "Phyllis Diller",
        "Testo": "Non andare mai a letto arrabbiato. Resta alzato e combatti."
    },
    {
        "Id": 5,
        "Autore": "Michael Jordan",
        "Testo": "Nella mia vita ho sbagliato più di novemila tiri, ho perso quasi trecento partite, ventisei volte i miei compagni mi hanno affidato il tiro decisivo e l’ho sbagliato. Ho fallito molte volte. Ed è per questo che alla fine ho vinto tutto."
    },
    {
        "Id": 6,
        "Autore": "Alan Perlis",
        "Testo": "Programmare è un atto innaturale."
    },
    {
        "Id": 7,
        "Autore": "Arthur Block",
        "Testo": "Se i costruttori costruissero come i programmatori programmano, il primo picchio che passa potrebbe distruggere la civiltà."
    },
    {
        "Id": 8,
        "Autore": "Brian Wilson Kernighan",
        "Testo": "Un buon programmatore è in grado di superare un linguaggio scarso o un sistema operativo confuso, ma anche un grande ambiente di programmazione non salverà un cattivo programmatore."
    },
    {
        "Id": 9,
        "Autore": "Jon Erickson",
        "Testo": "I primi hacker trasformarono la programmazione da un'attività puramente tecnica in una forma d'arte destinata, come spesso accade, alla fruizione da parte di un'élite di cultori della materia, risultando invece incomprensibile ai profani."
    }
]

La pagina iniziale da cui partire è come al solito la pagina start.php.

start.php

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Json data</title>

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
</head>


<body>

    <?php


    function get_json_file()
    {
        // da completare
        $url = "";
        $file = "";

        return $file;
    }

    function get_list_post()
    {
        // da completare
        $list = <<<DELIMETER
            <div class="col-md-4 mb-4">
                <figure>
                    <blockquote class="blockquote">
                        <p class="mb-0">Testo autore</p>
                    </blockquote>
                    <figcaption class="blockquote-footer">
                        Scritto da <cite title="Nominativo autore">Nominativo autore</cite>
                    </figcaption>
                </figure>
            </div>
            DELIMETER;

        return $list;
    }

    function get_random_single_post()
    {
        // da completare
        $post = <<<DELIMETER
            <div class="col-md-12 mb-4">
                <figure>
                    <blockquote class="blockquote">
                        <p class="mb-0">Testo autore</p>
                    </blockquote>
                    <figcaption class="blockquote-footer">
                        Scritto da <cite title="Nominativo autore">Nominativo autore</cite>
                    </figcaption>
                </figure>
            </div>
            DELIMETER;

        return $post;
    }

    function print_info($response)
    {
        echo "<pre>";
        var_dump($response);
        echo "</pre>";
    }
    ?>

    <div class="container">
        <div class="row">
            <div class="mb-5 mt-2">
                <h1 class="display-3 text-success">Frasi motivazionali</h1>
                <p class="lead">Le più belle frasi da leggere per ritrovare la motivazione <i class="bi bi-emoji-smile"></i></p>
                <p>Recuperare le frasi da un file in formato *.json</p>
            </div>
        </div>

        <div class="row">
            <div class="col-md-12 mb-4 text-center">
                <h1 class="display-6 text-success">Frase del giorno</h1>
                <?php echo get_random_single_post(); ?>
            </div>
        </div>

        <div class="row">
            <?php echo get_list_post(); ?>
        </div>
    </div>


    <!-- Bootstrap Bundle with Popper -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>

</body>

</html>

Una volta creato il file start.php controllate che il codice venga interpretato correttamente. In questo file ci sono tre funzioni che dovrete completare:

  1. get_json_file()
  2. get_list_post()
  3. get_random_single_post()

la prima funzione, get_json_file(), si occupa di recuperare il contenuto del file dall'indirizzo web o locale che avete specificato; la seconda funzione, get_list_post(), si occupa di creare una lista di tutte le frasi mentre la terza funzione, get_random_single_post(), di visualizzare la frase del giorno sorteggiata casualmente dalla lista. La funzione print_info() la potete usare in fase di debug. Per risolvere l'esercizio basterà concentrarsi sulle seguenti funzioni:

  1. file_get_contents()
  2. json_decode()
  3. rand()

Nelle immagini a fine articolo trovate l'output corretto di come dovrebbe venire. Buon lavoro :)

finish.php

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Json data</title>

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
</head>


<body>

    <?php

    function get_json_file()
    {
        $url = "http://corsophp:8080/challenge_18/file/posts.json";
        $arrContextOptions = array(
            "ssl" => array(
                "verify_peer" => false,
                "verify_peer_name" => false,
            ),
        );

        $file = file_get_contents($url, false, stream_context_create($arrContextOptions));

        return $file;
    }

    function get_list_post()
    {
        // Return as Array associative
        $posts = json_decode(get_json_file(), true);

        $list = '';
        for ($c = 0; $c < sizeof($posts); $c++) :
            $testo = $posts[$c]["Testo"];
            $autore = $posts[$c]["Autore"];

            $list .= <<<DELIMETER
                <div class="col-md-4 mb-4">
                    <figure>
                        <blockquote class="blockquote">
                            <p class="mb-0">{$testo}</p>
                        </blockquote>
                        <figcaption class="blockquote-footer">
                            Scritto da <cite title="{$autore}">{$autore}</cite>
                        </figcaption>
                    </figure>
                </div>
            DELIMETER;
        endfor;

        return $list;
    }

    function get_random_single_post()
    {
        // Return as Object
        $posts = json_decode(get_json_file(), false);
        $c = rand(0, sizeof($posts) - 1);
        $testo = $posts[$c]->Testo;
        $autore = $posts[$c]->Autore;

        $post = <<<DELIMETER
        <div class="alert alert-secondary">
            <figure>
                <blockquote class="blockquote">
                    <p class="mb-0">{$testo}</p>
                </blockquote>
                <figcaption class="blockquote-footer">
                    Scritto da <cite title="{$autore}">{$autore}</cite>
                </figcaption>
            </figure>
        </div>
        DELIMETER;

        return $post;
    }

    function print_info($response)
    {
        echo "<pre>";
        var_dump($response);
        echo "</pre>";
    }
    ?>

    <div class="container">
        <div class="row">
            <div class="mb-5 mt-2">
                <h1 class="display-3 text-success">Frasi motivazionali</h1>
                <p class="lead">Le più belle frasi da leggere per ritrovare la motivazione <i class="bi bi-emoji-smile"></i></p>
                <p>Recuperare le frasi da un file in formato *.json</p>
            </div>
        </div>

        <div class="row">
            <div class="col-md-12 mb-4 text-center">
                <h1 class="display-6 text-success">Frase del giorno</h1>
                <?php echo get_random_single_post(); ?>
            </div>
        </div>

        <div class="row">
            <?php echo get_list_post(); ?>
        </div>
    </div>


    <!-- Bootstrap Bundle with Popper -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>

</body>

</html>
Mettiti alla prova: lettura di un file json
Mettiti alla prova: lettura di un file json
Mettiti alla prova: lettura di un file json