Bonjour,
Je vais créer le tutoriel au fur et à mesure du temps que j'aurais donc les différentes parties n'arriverons pas toutes en même temps. A priori, les parties seront dissociés, donc vous pourrez les lires dans l'ordre que vous voudrez.
Nombre de parties : 4
Voici les parties :
#############################################################################
#############################################################################
##############################################################################
Je vais créer le tutoriel au fur et à mesure du temps que j'aurais donc les différentes parties n'arriverons pas toutes en même temps. A priori, les parties seront dissociés, donc vous pourrez les lires dans l'ordre que vous voudrez.
Nombre de parties : 4
Voici les parties :
Les arrays et les doubles quotes
Voici un problème récurent sur le forum PHP. Un zéro créer un script quelconque :
Et il se plain d'avoir l'erreur suivante, a priori incompréhensible :
- Code:
<?php
echo "La page demandé est : $_GET['page']";
?>
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/www/tests/8.php on line 2
On leur dit alors qu'il faut utiliser la concaténation :
- Code:
<?php
echo 'La page demandé est : '.$_GET['page'];
?>
Et là, le zéro tout content dit : ça marche
Mais tout le monde est maintenant persuadé que on ne peut pas utiliser les arrays dans une chaine délimité par des doubles quotes, alors qu'il n'est pas beaucoup plus difficile de le faire qu'avec des variables simples.
Par exemple, testez ça :
Question : C'est quoi ce miracle? Ça marche o_O !
- Code:
<?php
$array('Bonjour', 'Au revoir');
echo "$array[1] monsieur";
?>
Ce n'est pas un miracle, c'est tout à fait normal. Regardez bien la différence entre les deux arrays insérés : $_GET['page'] et $array[1].
Question : Euh, tu utilise une variable super-globale?
Non, c'est pas ça! Bon, je vais être gentils, je vous donne un autre exemple (qui marche, bien sûr) :
- Code:
<?php
echo "La page demandé est : $_GET[page]";
?>
Comme vous pouvez le voir, c'était les apostrophes qui envoyaient l'erreur
Question : Et si je veut utiliser cet array?
. Ça marchera pas :'(
- Code:
<?php
$array = array('\'chaine\''=>'truc')
?>
Arf, si vous vous mettez à me poser descollesquestions très intéressantes, on va vraiment avancer. En effet, ça ne marchera pas, mais il ne faut pas croire que l'on a atteint les limites du php. ^^ En fait, il existe une syntaxe particulière pour pouvoir écrire n'importe quel array, voire même retour de fonction dans une chaine délimité par des doubles quotes.
En fait, ça consiste juste à entouré la variable ou l'array par des crochets : {$variable} ou {$array['clé']}.
Comme vous pouvez le voir, il faut, cette fois-ci, mettre des apostrophes pour délimiter la clé de l'array.
Un petit exemple pour la route :
- Code:
<?php
$var = 'truc';
echo "la variable \$var a pour valeur : {$var}";
$array = array('machin', 'bidule');
echo "les deux valeurs de \$array sont : {$array[0]} et {$array[1]}";
?>
C'était pas trop compliqué?
Question : Et pour écrire le résultat d'une fonction, on fait comment?
C'est un peu plus compliqué étant donné que {ta_fonction()} ne marche pas. Mais en lisant la suite du tutoriel, vous saurez bientôt le faire .
#############################################################################
Accéder à un caractère particulier dans une chaine
Vous ne vous êtes jamais demander comment récupérer le 5° caractère d'une chaine? C'est pas très dur. Il suffit de manipuler la chaine comme un array. Le premier caractère sera à l'index 0, le deuxième à l'index 1, etc :
Attention : Malgré les apparences, une chaine de caractère N'EST PAS un array! Utiliser foreach (et tout ce qui est spécifique aux arrays) sur une chaine créera une erreur!
- Code:
<?php
$chaine = 'une chaine de caractère quelconque';
echo $chaine[0]; // affiche : u
echo $chaine[5]; // affiche : h
?>
De la même façon, on peut aussi modifier un caractère particulier d'une chaine :
Attention, cela ne marche que pour modifier un seul caractère à la fois. Si vous faites $chaine[8] = 'rat';, cela ne modifiera que le 8° caractère (un chaine commence par le caractère 0), la chaine deviendra donc 'Il a un ric' et pas 'Il a un rat'.
- Code:
<?php
$chaine = 'Il a un tic';
$chaine[9] = 'o';
echo $chaine; // affiche : Il a un toc
?>
J'en profite pour vous faire remarquer ceci :
- Code:
<?php
$chaine = 'truc';
$chaine[9] = 'o';
echo $chaine; // affiche : truc o
?>
Comme vous pouvez le voir, la chaine est agrandie et des espaces sont rajoutés entre le caractère et la fin de l'ancienne chaine si vous essayez de modifier un caractère qui n'est pas dans la chaine.
Information : Bien que cela semble fonctionner, il vaut mieux l'éviter. PHP nous le dit en nous envoyant la notice suivante : Notice: Uninitialized string offset: 5 in /chemin/vers/le/fichier on line 3
Et, bien évidement, si vous modifier un caractère dont l'emplacement est négatif (par exemple $chaine[-1]), vous aurez droit à l'erreur suivante :
Warning: Illegal string offset: -1 in /chemin/vers/le/fichier on line 32
Erreur : Attention, vous ne pouvez pas supprimer un caractère en utilisant unset, cela provoque une erreur fatale.
Par exemple :
- Code:
<?php
$chaine = 'truc';
unset($chaine[3]);
?>
Vous affichera l'erreur suivante : Fatal error: Cannot unset string offsets in /chemin/vers/le/fichier on line 2
#############################################################################
Print_r()
Vous ne vous êtes jamais dit que écrire :
était un peut long et fastidieux pour afficher le contenu d'un array? Si c'est le cas, j'ai la solution, pour les autres, ça pourra quand même vous servir plus tard.
- Code:
<?php
echo '<pre>';
print_r($array);
echo '</pre>';
?>
M@téo vous a dit qu'il fallait utiliser print_r() pour afficher le contenu d'un array. Il a raison, mais il ne vous a pas dévoilé tous les secrets de cette fonction. En effet, en regardant de plus près dans la documentation, on peut voir que cette fonction possède un paramètre facultatif qui permet d'indiquer à la fonction que l'on veut (ou que l'on ne veut pas) qu'elle revoie la chaine de caractère au lieux de l'afficher directement.
Il faut donc faire comme ceci pour lui indiquer : print_r($array, true);
Et par extension, si on veut afficher le contenu d'un array en une seule ligne :
Ce code ferra exactement la même chose que le code présenté au début de ce paragraphe.
- Code:
<?php
echo '<pre>'.print_r($array, true).'</pre>';
?>
##############################################################################
List()
Allons-y pour une "fonction" (plutôt un élément du langage, comme while ou echo) qui va permettre de stocker le contenu d'un array dans plusieurs variables.
Comme un exemple vaut mieux d'un paragraphe d'explication :
Vous voyez donc que le premier élément de $array est affecté au premier argument de list(), le deuxième élément de $array est affecté au deuxième argument de list(), etc...
- Code:
<?php
$array = array('foo', 'bar');
list($var1, $var2) = $array;
echo '$var1 = '.$var1; // affiche $var1 = foo
echo '$var2 = '.$var2; // affiche $var2 = bar
?>
Information : Si $array n'est pas un array, rien ne sera affecté, les variables resterons vides et cela ne génèrera pas d'erreurs. Si il y a trop d'arguments dans list() les variables en trop seront créé, mais resterons vides, cela ne créé pas non plus d'erreur.
Exemples :
Question : C'est bien beau tout ça, mais ça va nous servir à quoi concrètement?
- Code:
<?php
list($a, $b, $c) = 'truc'; // $a, $b et $c seront vides
list($a, $b, $c) = array(1, 2); // $a=1, $b=2 et $c est vide
list($a, $b) = array(1, 2, 3, 4); // $a=1, $b=2 et les autres valeurs de l'array ne servent à rien
?>
J'y viens! En fait, il y a deux moments où ça peut être pratique :
Premier cas où list() est utile : pour affecter $a à $b et $b à $a, sans list, vous êtes obligé d'utiliser une variable temporaire :
D'un coup, ça réduit le code, non?
- Code:
<?php
$a = 'foo';
$b = 'bar';
// sans list() :
$tmp = $a;
$a = $b;
$b = $tmp;
// avec list() :
list($a, $b) = array($b, $a);
?>
Deuxième cas où list() est utile : si on veut renvoyer plusieurs élément avec une fonction. Assez souvent, on vois des codes comme ceci :
- Code:
<?php
function infoNombre($nombre)
{
$carre = $nombre*$nombre;
$racine = sqrt($nombre);
$valeurAbsolue = abs($nombre);
return array('carre'=>$carre, 'racine'=>$racine, 'valeurAbsolue'=>$valeurAbsolue);
}
$array = infoNombre($_POST['nombre']);
$carre = $array['carre'];
$racine = $array['racine'];
$valeurAbsolue = $array['valeurAbsolue'];
?>
Alors que l'on peut le réduire comme ceci :
- Code:
<?php
function infoNombre($nombre)
{
$carre = $nombre*$nombre;
$racine = sqrt($nombre);
$valeurAbsolue = abs($nombre);
return array($carre, $racine, $valeurAbsolue);
}
list($carre, $racine, $valeurAbsolue) = infoNombre($_POST['nombre']);
?>
Dernière édition par Berdes1 le Jeu 17 Sep - 22:35, édité 7 fois