PHP : compléments

Licence Informatique 2ème année

Youssef Chahir

 

PHP : compléments

Notes de cours

Travail personnel

Objectifs

On continue à manipuler PHP et on aborde ses différentes fonctionnalités.

Exercice 1 — Composition de pizzas #

Dans cet exercice, on travaille sur un tableau associatif qui comporte des clés qui sont des chaînes de caractères représentant des noms d'ingrédients et des valeurs qui sont les prix de ces ingrédients donc des réels. On aura par exemple le tableau suivant : $dicoprix=array("jambon"=>3,"saucetomate"=>1.5,'poivrons'=>2,'oignons'=>1,"champignons"=>2,"mozarella"=>1.5,                           "cremefraiche"=>1.5,"chevre"=>2,"tomates"=>2,"lardons"=>2.5,'saumon'=>4,'merguez'=>3);

  1. Écrire la fonction combien($dico) qui renvoie le nombre d'ingrédients présents dans le tableau $dico.
  2. Écrire la fonction prix_moyen($dico) qui renvoie la moyenne des prix des ingrédients du tableau $dico.
  3. Remarque : on pourra arrondir le prix avec 2 chiffres après la virgule.
  4. Écrire la fonction moinscher($dico) qui renvoie le tableau avec les noms des ingrédients le moins cher du tableau $dico.
  5. Écrire la fonction dollars($dico) qui modifie $dico pour que les prix soient en dollars. On prendra comme taux de conversion 1 euro correspond à 1.12 dollars.
  6. Écrire la fonction prixpizza($l,$dicoprix) qui étant donnés une liste d'ingrédients $l qui correspond aux ingrédients d'une pizza et un tableau de prix renvoie le prix de la pizza correspondante : pour cela on fera le total des prix des ingrédients qu'on multipliera par 1.5 pour tenir compte de la pâte, du four etc.... On suppose que tous les ingrédients des listes sont présents dans le tableau $dicoprix.
  7. Le patron gère plusieurs succursales et il se rend compte qu'il n'y a pas les mêmes prix partout. Écrire la fonction gestion($dicoprix1,$dicoprix2) qui étant donnés deux tableaux va fabriquer un nouveau tableau de prix : dans le nouveau tableau il doit y avoir tous les ingrédients présents dans l'un des deux tableaux et quand un ingrédient est dans les deux tableaux, on doit garder le prix le moins élevé des deux.
  8. On considère un deuxième tableau : les clés sont des strings qui sont des noms de pizzas et les valeurs associées sont des listes d'ingrédients. On aura comme exemple :
    $monDicoPizzas=array(
                              "reine"=>["jambon","mozarella","sauce_tomate","champignons"],
                              "vesuvio"=>['merguez','jambon','mozarella','poivrons','oignons'],
                              "cabri"=>["chevre","lardons","creme_fraiche","mozarella"],
                              "napoli"=>["jambon","tomates","mozarella","sauce_tomate","champignons","poivrons","oignons"],
                              "neptune"=>['saumon','creme_fraiche','champignons']);
  9. Écrire la fonction possible($dicopizzas, $val, $dicoprix) qui renvoie un tableau vaec tous les noms des pizzas qu'on peut acheter si on a la somme val.
  10. Finalement on décide d'avoir une fonction qui peut construire un troisième tableau.
    1. Écrire la fonction fusion($dicoprix, $dicopizzas) qui renvoie le tableau où chaque pizza est associée à son prix et ses ingrédients (la valeur associée à un nom de pizza sera un tableau composé de 1) la liste des ingrédients et 2) du prix)
    2. Écrire une fonction affichage qui étant donné un tel tableau (issu de la fusion) fait un affichage style menu de pizzeria :
      Menu des pizzas :
      * Pizza reine : 12 euros -- jambon/mozarella/sauce_tomate/champignons
      * Pizza vesuvio : 15.75 euros -- merguez/jambon/mozarella/poivrons/oignons
      .....
    3. Le responsable de la pizzeria veut aider les gens allergiques.
      • Ecrire la fonction inter($l1,$l2) qui teste si deux tableaux $l1 et $l2 ont au moins un élément commun.
      • En déduire la fonction sansAllergie($monDicoPizzas, $listeallergenes) qui renvoie les noms des pizzas qui ne contiennent aucun élément de listeallergenes dans leur composition.

Exercice 2 — Analyse d’un fichier CSV #

Dans cet exercice on va manipuler un fichier CSV avec des données sur les prénoms donnés en France. Ce fichier est mis à disposition sur le portail des données ouvertes du gouvernement.

  1. Télécharger le fichier des données par département de naissance (au cas où, je mets le lien du fichier sur le portail). Décompressez l'archive et placez le fichier CSV quelque part.
  2. Regarder un peu le contenu du fichier (attention, il fait 75 Mo : vous pouvez utiliser par exemple less en ligne de commande pour que ça reste fluide), et comprendre le contenu. Par exemple, la ligne 1;AARON;2005;14;4 signifie qu'en 2005, dans le Calvados, sont nés quatre bébés assignés garçons qui ont été prénommés Aaron. Voir aussi la doc sur le site.
  3. On va manipuler ces données depuis un script PHP, en convertissant le fichier CSV en un tableau de tableaux. Chaque élément du tableau correspondra à une ligne du fichier, et sera un tableau associatif avec comme clefs sexe, prenom, annee, departement, nombre.

    Créer un script prenoms.php ; si vous êtes vraiment à l'aise, vous pouvez essayer d'écrire le code pour lire le fichier et construire le tableau de données décrit au paragraphe précédent, mais ce n'est pas la priorité du TP. Pour gagner du temps vous pouvez simplement copier le code suivant :

    // ouvrir le fichier en lecture
    $fp = fopen('dpt2018.csv', 'r');
    
    // initialiser un tableau pour y mettre les données extraites du fichier
    $data = array();
    
    // ATTENTION la 1ère ligne du fichier contient les entêtes:
    // sexe;preusuel;annais;dpt;nombre
    // Il ne faut pas l'ajouter au tableau de données.
    // Pour cela, on lit 1 ligne avant de commencer la boucle.
    $line = fgets($fp);
    
    // lire ligne à ligne
    while (($line = fgets($fp)) !== false) {
        // enlever le caractère de fin de ligne
        $line = trim($line);
    
        // extraire les infos (séparateur «;»)
        // $infos est donc un tableau avec sexe, prénom, année, département, nombre
        $infos = explode(";", $line);
        // ajouter un élément au tableau $data
        // les champs sexe, annee et nombre sont convertis en int,
        // mais pas departement (par ex Corse a 2 départements 2A et 2B...)
        $data[] = [
            "sexe" => (int) $infos[0],
            "prenom" => $infos[1],
            "annee" => (int) $infos[2],
            "departement" => $infos[3],
            "nombre" => (int) $infos[4],
        ];
    }
    // fermer le fichier
    fclose($fp);
    
  4. Regarder le contenu du tableau résultant $data (avec var_export ou une autre fonction d'affichage debug) et s'assurer de bien en comprendre la structure.
  5. Utiliser ce tableau pour répondre aux questions suivantes.
    1. Combien d'enfants sont nés (en France) sur la période ?
    2. Combien d'enfants sont nés dans le Calvados (14) sur la période ?
    3. Combien d'enfants ont été appelés David sur la période ?
    4. Quel était le prénom féminin le plus fréquent dans la Manche (50) en 1978 ?
    5. Combien de prénoms différents le fichier contient-il ?
    6. Quel prénom a été le plus donné sur la période ?
    7. Optionnel: Combien d'enfants ont eu un nom commençant par un ou plusieurs « A » et se terminant par un ou plusieurs « Z » ?
    8. Optionnel: Combien y a-t-il eu de naissances à la Guadeloupe (971) sur la période ? NB: les données ne permettent de répondre qu'approximativement à cette question, car les prénoms donnés moins de 3 fois dans une année sont rassemblés dans l'année spéciale XXXX
    9. Optionnel: Quel département a la plus grande diversité de prénoms (ratio du nombre de prénoms distincts donnés sur la période et du nombre de naissances) ?