
# TP1 : bases du langage PHP

**À l'IUT**

Le repertoire `public_html` à la racine de votre compte est accessible  par http(s) à l'url suivante :

```
http[s]://dwarves.iut-fbleau.fr/~login/
```

**Ailleurs**

Pour monter ce repertoire dans votre aborescence locale, vous pouvez utiliser le programme `sshfs` :
```
sshfs login@iut-fbleau.fr:/export/home/info-but25/login repertoire/de/montage/local/
```

Depuis la version 5.4, la commande `php` embarque un serveur web interne :

```bash
php -S localhost:8080 -t repertoire
```

Le repertoire passé en paramètre est la racine du serveur web.


### Ex1
Vous allez tester votre premier script php : `hello_world` :
 ```php
 <!DOCTYPE html>
 <html>
 	<body>
 	<?php echo "<h1>hello world</h1>";?>
 	</body>
 </html>
 ```

 - Placez le  fichier `hello_world.php` dans votre
 repertoire `public_html`, et testez.

 - En utilisant la fonction `phpinfo`, faites afficher dans le script
 précédent la configuration php du serveur dwarves.

### Ex2
Quel est l'entier servant de clé à
 - chaque élément du tableau 
   suivant :
   ```php
	<?php
	$clients = [
		"Luc", 
		7 => "Paul", 
		2 =>"Martin", 
		"Arnaud"
		];
    ?>
   ```	

 - à l'élément de valeur `Blouson` dans le tableau `$produits` ?
   ```php
	<?php
	$produits = [
		20 => "Chemise",
		3 => "Pantalon",
		10 => "Jupe",
		"Veste",
		"Blouson"
	];
	?>
	```
 - à chaque élément du tableau `$array` ?
   ```php
	<?php
		$array = ["a","b","c"];
		$array[] = "d";
		$array[10] = "j";
		unset($array[2]);
	?>
   ```
### Ex21
- Créez un tableau de 10 cases dont la clé i contient la somme des entiers jusqu'à i.
- Créez un tableau de 10 cases dont la clé i<sup>2</sup> contient  i
.
### Ex22
Écrivez un script php affichant les entiers de 1 à 50.
- Faites en sorte que les impairs soient en italique, et les pairs en gras.
- Regroupez chaque dizaine dans un même paragraphe.

### Ex3
Vous disposez du fichier [data.php](./ex3/include/data.inc.php) qui
représente, sous forme d'un tableau, un certain nombre
d'individus, avec pour chacun ses nom, prénom, email, taille et
poids.

Voici un extrait du fichier :
```php
$data = array(
array("Nom"=>"Garza","Prenom"=>"Forrest","Email"=>"eleifend@ligulaedu","Taille"=>"185","Poids"=>"65"),
array("Nom"=>"Tanner","Prenom"=>"Orla","Email"=>"adipiscing@vitaecouk","Taille"=>"180","Poids"=>"73"),
...
```

1. Ecrire un script qui affichent l'ensemble des données sous
   forme d'un tableau html.
2. L'imc (indice de masse corporel) d'une personne est donné par
   la formule $\frac{poids}{taille^2}$ (poids en kilogramme et taille en mètre).  
   Ajouter une colonne avec la valeur de l'imc (2 chiffres après la virgule).  
3. Une personne est considérée en surpoids lorsque son imc
   dépasse 25. Colorier les lignes du tableau lorsque la
   personne correspondante est en surpoids.  
   ![tableau](./ex3/img/tableau_ex3.png)

<details><summary>Conseils</summary>
<div>

- Pour utiliser le fichier de données, incluez-le dans votre
  script.
- La structure de langage `foreach` fournit une façon simple de
  parcourir des tableaux. `foreach` ne fonctionne que pour les
  tableaux et les objets, et émettra une erreur si vous tentez de
  l'utiliser sur une variable de type différent ou une variable
  non initialisée. Il existe deux syntaxes :

  ```php		 
   foreach (array_expression as $value){
	
   }
				 
   foreach (array_expression as $key => $value){

   }
  ```
		
	Des [exemples]](http://fr2.php.net/manual/fr/control-structures.foreach.php).

- Pour arrondir un réel, vous pouvez utiliser la fonction [round](https://www.php.net/manual/fr/function.round.php).  
</div>
</details>  

### Ex4
Ecrivez un script qui permet de lancer deux dés, et en affiche la somme. Utilisez la fonction [mt_rand](https://www.php.net/manual/en/function.mt-rand.php) pour la génération aléatoire.  


   ![tableau](./ex4/img/exo4.png)

### Ex5
Ecrire un programme PHP qui affiche, sous forme d'une liste
"cliquable" vos bookmarks (favoris) stockés dans un tableau
associatif. Vos bookmarks seront classés par répertoire. Chaque
répertoire aura donc un nom, et contiendra un certain nombre de
favoris représentés par un nom, une image et une url.

Exemple d'affichage :

-   Moteurs de recherche :
    -   [<img  src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/272px-Google_2015_logo.svg.png" width=40>](http://google.fr).
    -   [<img  src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Yahoo%21_%282019%29.svg/200px-Yahoo%21_%282019%29.svg.png" width=40>](http://yahoo.fr).
-   Journaux :
    -   [<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Le_monde_logo.svg/200px-Le_monde_logo.svg.png" width=40>](http://lemonde.fr).
    -   [<img src="http://upload.wikimedia.org/wikipedia/fr/0/0a/GNUlinuxmagazinefrance.png" width=40>](http://www.unixgarden.com/index.php/category/gnu-linux-magazine).
    -   [<img src="http://upload.wikimedia.org/wikipedia/commons/3/32/L%27%C3%89quipe_wordmark.svg" width=40>](http://lequipe.fr).
-   Sports :
    -   [<img src="http://upload.wikimedia.org/wikipedia/fr/6/67/Logo_F%C3%A9d%C3%A9ration_Fran%C3%A7aise_de_Football.svg" width=50>](http://fff.fr).
    -   [<img src="http://upload.wikimedia.org/wikipedia/fr/b/bf/FFDF.jpg" width=50>](www.ffdf.fr).

### Ex6
Ecrire (et tester) une fonction 

```php
<?php
string createPassword(int $n, string $alphabet);
?>
```

qui permet de générer un mot de passe de `n` caractères choisis
aléatoirement parmi les caractères de `alphabet`.

<details><summary>Conseils</summary>

Il suffit de tirer aléatoirement n caractères de la chaîne alphabet et de les concatener.

Les fonctions 
[strlen](https://www.php.net/manual/fr/function.strlen.php) 
et 
[mt_rand](https://www.php.net/manual/fr/function.mt-rand.php) pourront vous être utiles.
</details>

### Ex61
On considère les deux tableaux suivants :

```php
$tabMagazines = [
  'le monde'              => ['frequence' => 'quotidien', 'type' => 'actualité', 'prix' => 220],
  'le point'              => ['frequence' => 'hebdo'    , 'type' => 'actualité', 'prix' => 80 ],
  'causette'              => ['frequence' => 'mensuel'  , 'type' => 'féminin'  , 'prix' => 180],
  'politis'               => ['frequence' => 'hebdo'    , 'type' => 'opinion'  , 'prix' => 100],
  'le monde diplomatique' => ['frequence' => 'mensuel'  , 'type' => 'analyse'  , 'prix' => 60 ],
  'libération'            => ['frequence' => 'quotidien', 'type' => 'actualité', 'prix' => 190],
];

$tabMagazinesAbonne = ['le monde', 'le monde diplomatique'];
```


1. Afficher sur une ligne le nom de tous les magazines triés par ordre alphabétique et séparés par des virgules, sans faire de boucle. 
   Vous utiliserez des fonctions déjà existantes telles que [implode](https://www.php.net/manual/en/function.implode.php), [sort](https://www.php.net/manual/en/function.sort.php)  et [array_keys](https://www.php.net/manual/en/function.array-keys.php)  que vous trouverez dans le manuel php.
2. Afficher séparés par des virgule les noms des quotidiens (et uniquement ceux-ci).
3. Afficher les magazines exactement de la façon suivante en supposant qu’il peut y avoir beaucoup de magazines et beaucoup de propriétés associées :
   - le monde (quotidien, actualité, 220)
   - le point (hebdo, actualité, 80)
   - causette (mensuel, féministe, 180)
   - politis (hebdo, opinion, 100)
   - le monde diplomatique (mensuel, analyse, 60)
4. En utilisant le tableau `$tabMagazinesAbonne` contenant le nom des magazines d’un abonné, calculer le prix total de son abonnement.

### Ex62
Sur les anciens cahiers d'écoliers, on trouvait sur la courveture la liste des tables de multiplications
<div align="center">
<img src="img/cahier.jpg">
</div>

Écrire un script php qui affiche les tables correspondantes.

### Ex7
On reprend l'exercice 3.

1. Ajouter une colonne de clé `Imc` aux personnes du tableau `$data`. On utilisera la fonction
[array_map](https://www.php.net/manual/fr/function.array-map.php).
2. Trier `$data` par ordre croissant d'imc. On utilisera la fonction [usort](https://www.php.net/manual/fr/function.usort.php).
3. Calculer l'imc moyen de l'ensemble des personnes. On utilisera la fonction [array_reduce](https://www.php.net/manual/fr/function.array-reduce.php).


### Ex8
1. Allez voir la page manuel PHP de [scandir](https://www.php.net/manual/en/function.scandir).
   Quel(s) sont ses arguments ? Que renvoie-t-elle ?
2. Utilisez scandir pour afficher des liens vers les autres fichiers de votre dossier public_html. On rappelle
   que la balise html `a` permet de créer des hyperliens.
3. Utilisez la méthode [str_ends_with](https://www.php.net/manual/en/function.str-ends-with.php) pour n’afficher que les scripts PHP.

Par ailleurs, une liste des fonctions sur les chaînes de caractères est disponible [ici](https://www.php.net/ref.strings).
