Page 1 sur 1

[Résolu] Notice: Uninitialized string offset:

Posté : 12 nov. 2005, 19:30
par zouetchou
Bonjour,

J'utilise le code ci-dessous pour tronquer des commentaires dont le nombre de caractères est superieur ou égal à 100.

Code : Tout sélectionner

/* On met en forme le commentaire avant l'affichage */ $Maxi = 100; $texte =''; $nbr_caracteres = strlen($Commentaire); if( $nbr_caracteres >= $Maxi) { $i=0; while ($i <= $Maxi) { $texte.= $Commentaire[$i]; $i++; } $texte.= '...'; } else { $texte = $Commentaire; }
Mais php renvoie:
Notice: Uninitialized string offset: 100 in /home/.../fichier.php on line 47

ce qui correspond à la ligne de code :
$texte.= $Commentaire[$i];

Comment eviter cette Notice?

Posté : 12 nov. 2005, 21:35
par Truc
Salut change cette boucle
while ($i <= $Maxi)
par
while ($i < $Maxi)
tu déppase le nombre de caractères

Posté : 13 nov. 2005, 02:04
par zouetchou
Ok merci :wink:

Posté : 13 nov. 2005, 10:14
par Cyrano
On peut peut-être simplifier:
/* On met en forme le commentaire avant l'affichage */
         $Maxi = 100;
         $texte ='';
         
         $nbr_caracteres = strlen($Commentaire);
         
         $texte = ( $nbr_caracteres > $Maxi) ? substr($Commentaire, 0, $Maxi) ."..." : $Commentaire;

Posté : 13 nov. 2005, 15:31
par zouetchou
Merci.

Puis-je avoir une explication sur ce code ?

Posté : 13 nov. 2005, 15:43
par Cyrano
:D C'est drôle, je l'attendais presque cette question...

BOn, la première chose, c'est qu'au lieu de m'amuser à compter les caractères de la chaine dans une boucle, j'utilise une fonction native de PHP : substr() qui me permet d'extraire une portion de chaine selon les paramètres envoyés. (Suis le lien vers la doc qui ne sera pas moins claire que moi sur les détails de cette fonction.

La seconde chose que j'ai utilisée s'appelle un opérateur ternaire :

Code : Tout sélectionner

$var = ($condition) ? "valeur 1" : "valeur 2";
C'est une manière différente d.écrire ceci:

Code : Tout sélectionner

if($condition == true) { $var = "valeur 1"; } else { $var = "valeur 2"; }
C'est strictement la même chose, mais l'opérateur ternaire se fait ici sur 1 ligne au lieu de 8 :) Ce qui suit le "?" est la valeur attribuée si la condition testée retourne "TRUE"; le ":" fait office de "else" et la seconde valeur proposée sera attribuée si le scondition testée retourne "FALSE"

Posté : 13 nov. 2005, 15:53
par zouetchou
Super Merci :D
En plus le traitement est plus rapide :wink: