[PHP] utilisation du foreach
Bonjour,
Je me suis dis que ce serai pratique d'utiliser foreach pour passer au regex toutes mes variables avant de les afficher.
Dans cette exemple, il s'agit d'un chat.
je récupère les données de ma table puis le foreach.
la page regex.php contient toutes les regex (elles fonctionnent)
Mais voila, sa ne fonctionne pas :p
Quelqu'un pourrait m'aider?
--
L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)
Je me suis dis que ce serai pratique d'utiliser foreach pour passer au regex toutes mes variables avant de les afficher.
Dans cette exemple, il s'agit d'un chat.
je récupère les données de ma table puis le foreach.
la page regex.php contient toutes les regex (elles fonctionnent)
$query = "SELECT pseudo,comment FROM raynal_chat ORDER BY id DESC LIMIT $premier_message, $nombre_entree_par_page";
$result = mysql_query($query)or die (mysql_error());
$css = 'clair';
// Puis on fait une boucle pour afficher tous les résultats :
while ($donnees = mysql_fetch_array($result) )
{
foreach ($donnees as $element)
{
include ('../includes/regex.php');
}
[affichage des données]
Mais voila, sa ne fonctionne pas :p
Quelqu'un pourrait m'aider?
--
L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)
29 réponses
Résumé de la discussion
Le problème porte sur l’application d’expressions régulières à chaque champ d’une ligne récupérée d’une table via un foreach, avec des confusions entre PHP et du code inspiré de JavaScript dans le traitement des données. Des réponses recommandent d’itérer sur les éléments avec une boucle for utilisant count($donnees) et de retirer les guillemets autour de l’indice, puis de réaffecter chaque élément modifié dans le tableau. D’autres proposent d’utiliser foreach avec une référence: foreach ($donnees as &$element) { include ('../includes/regex.php'); } afin que les changements persistent sans réaffectation manuelle et réduisent les erreurs liées aux indices.
-
Okuni,
ça m'a l'air un peu confus tout ça dans ta tête :P
Je vais reprendre à partir du bout de code que tu donnes dans le post n°12.
Alors, $donnees est un tableau contenant une ligne de la base de données. Comme tout tableau qui se respecte, il a un nombre d'éléments accessible via sa propriété length, c'est ce que tu demandais plus haut :
donnees.length est le nombre d'éléments du tableau. (je vais l'appeler n)
Pour passer le regexp à tous les éléments, il est donc nécessaire d'itérer sur tous les éléments : on part de 0 (le 1er élément) et on va jusqu'à n - 1 (le n-ième élément).for ($i = 0; i <= donnees.length - 1; $i++)
Ça va, tu suis ?
Là ça corrige déjà un problème : tu n'allais que jusqu'à 1.
Ensuite :$element = $donnees[$i];
Là je corrige quoi ? > j'ai viré les guillemets ^^
Si tu mets des guillemets, PHP cherche dans le tableau une valeur portant la clé '$i' en toutes lettres, et pas le numéro porté par $i. Résultat : il ne trouve pas, il renvoie null et donc $element = null quand il arrive dans le regexp. Ensuite il fait un preg_replace sur ce null, et comme ça ne le dérange pas plus que ça, il ne déclenche pas de message d'erreur : il renvoie null lui aussi.
Tu suis toujours ? ^^
Enfin, d'après ce que j'ai compris, ton script va afficher les données à partir du tableau $donnees, qui a été modifié par le passage du regexp. Donc à la fin d'un tour de boucle, la valeur $element retourne dans $donnees[$i]. Eh oui, tu as mis aussi des guillemets ! Du coup il stocke la valeur dans une case du tableau portant la clé '$i' en toutes lettres, dont tu ne te sers pas après (puisque tu ne sais pas qu'elle existe :D)
Retire les guillemets et ça sera stocké au bon endroit ;)
Le script final :for ($i = 0; $i <= $donnees.length - 1; $i++ ) { $element = $donnees[$i]; include ('../includes/regex.php'); $donnees[$i] = $element; }
Dis-moi si ça marche :P -
ok merci beacoup mais je trouve que sa complique fort le code. :(
-
-
@Alain_42merci quand même :)
J'ai appris des trucs en plus :D
-
-
Désolé Alain_42, Je n'avais pas vu ton message, quand j'ai cliqué sur le lien pour voir les nouveau message, j'ai été directement au dernier, j'ai pas pensé qu'il y avait une autre page.
Je n'ai pas tout compris.
l'include de mes regexp, je dois le faire avant le while ou dedans?
si dehors, les regexp ne fonctionne pas, si dedans, j'ai un message d'erreur :
Fatal error: Cannot redeclare remplacement()
(erreur sur la page des regexp)
encore désolé ;)-
-
@Alain_42Ok, c'est bien ce que j'avais essayé.
Mes données s'affichent mais elle ne sont pas transformée par les regex.include ('../includes/regex.php'); // Puis on fait une boucle pour afficher tous les résultats : while ($donnees = mysql_fetch_array($result) ) { foreach ($donnees as $element) { $element = remplacement($element); } ?> <table width="100%" style="text-align:left;"> <tr> <td class="<?php echo $css;?>"><b><?php echo $donnees['pseudo']; ?></b> : <?php echo $donnees['1']; ?></td> </tr> </table> <?php } -
@okuniC'est normal, tu transforme
$element = remplacement($element);
par tes regex et tu affiches qd même les données lues dans la base
echo $donnees['pseudo'];
fais comme ça:
<?php include ('../includes/regex.php'); ?> <table width="100%" style="text-align:left;"> <?php // Puis on fait une boucle pour afficher tous les résultats : while ($donnees = mysql_fetch_array($result) ){ echo "<tr><td class=".$css.">"; foreach ($donnees as $cle=>$element){ //la j'ai change un peu pour avoir le nom de la cle de l'array pour tester pseudo et le mettre en gras $element = remplacement($element); if($cle=='pseudo'){ echo "<b>".$element."</b>"; }else{ echo $element; } } } ?> </td></tr></table>
-
-
je t'ai donné une solution, l'as tu au moins testée ?
-
La question était a quoi sert $donnees.length je n'ai jamais dit qu'il s'agissait de php cela se rapprocherais plutôt du js encore que le $ n'a rien a voir et qu'il manque des parenthèses...
-
Mais pas en php, puisque tout le monde se casse le nez dessus dans ce topic :D
D'ailleurs je ne vois pas comment ça se pourrait dans la mesure où l'opérateur point, en php, ne sert qu'à concaténer. -
$donnees.length retourne un nombre entier ayant pour valeur la taille du tableau...(et donc le nombre de données...)
-
Ouais, alors en fait c'est pas du tout $donnees.length() je m'écrase comme une crotte en confondant avec Javascript. Mais bon, personne est là pour me récupérer hein, vous valez pas mieux que moi :P
Alors la longueur du tableau en php c'est :count($donnees)
Sinon l'idée de Stef60 est pas mauvaise, passer par référence, faut voir si ça marche. -
OK.
As-tu essayé avec cette synthaxe :
foreach ($donnees as &$element) -
Si bien sur mais c'est pas du tout mon but.
Ce que je recherche c'est de faire un code adaptaptable n'importe ou car dans d'autre cas, j'ai alors beaucoup plus de lignes a écrire. -
Et un truc comme ca ne marcherait pas ?
A condition bien sur de transformer regex en fonction.
while ($donnees = mysql_fetch_array($result) )
{
if ($css == 'clair')
{
$css = 'fonce';
}
else
{
$css = 'clair';
}
$pseudo = function_regex($donnees['pseudo']);
$comment = function_regex($donnees['comment']);
?>
<table width="100%" style="text-align:left;">
<tr>
<td class="<?php echo $css;?>"><b><?php echo $donnees['pseudo']; ?></b> : <?php echo $donnees['comment']; ?></td>
</tr>
</table>
<?php
} -
Je ne sais pas, quand je fais un echo, il ne me met rien
for ($i = 0; $i <= $donnees.length - 1; $i++ ) { echo '$donnees.length : '.($donnees.length).'<br/>'; echo 'donnees 1 : '.$donnees[$i].'<br/>'; $element = $donnees[$i]; echo 'element 1 : '.$element.'<br/>'; include ('../includes/regex.php'); echo 'element 2 : '.$element.'<br/>'; $donnees[$i] = $element; echo 'donnees 2 : '.$donnees[$i].'<br/>'; }
et les autre echo ne me donne rien non plus.-
Salut,
tu fais une boucle
et à chaque passage de la boucle tu fais un include du même fichier
Utilité ????
tu connais les fonctions en php alors essayes comme ça en metant ta preReplace dans une fonction que tu vas appeler à chaque passage de la boucle:
// la fonction function remplacement($chaine){ $chaine = preg_replace('#\[b\](.+)\/b\#isU', '<strong>$1</strong>', $chaine);//gras $chaine = preg_replace('#\[i\](.+)\/i\#isU', '<em>$1</em>', $chaine);//italique $chaine = preg_replace('#\[u\](.+)\/u\#isU', '<u>$1</u>', $chaine);//souligné $chaine = preg_replace('#\[q\](.+)\/q\#isU', '<q>$1</q>', $chaine);//citation $chaine = preg_replace('#\[center\](.+)\/center\#isU', '<div style="text-align:center">$1</div>', $chaine);//centré $chaine = preg_replace('#\[color=(red|green|blue|yellow|purple|olive)\](.+)\/color\#isU', '<span style="color:$1">$2</span>', $chaine);//couleur $chaine = preg_replace('#\[url=http://(.+)\](.+)\/url\+#isU', '<a href="http://$1">$2</a>', $chaine);//lien $chaine = preg_replace('#\[url\]http://(.+)\/url\+#isU', '<a href="http://$1">$1</a>', $chaine);//lien $chaine = preg_replace('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#isU', '<a href="mailto:$0">$0</a>', $chaine);//mail $chaine = preg_replace('#\[img\](.+)\/img\#isU', '<img src="$1" alt="$1" />', $chaine);//image //regex des smileys $chaine = preg_replace('#:D#isU', ' <img src="../images/smileys/biggrin.gif" alt=":D" /> ', $chaine); $chaine = preg_replace('#XD#isU', ' <img src="../images/smileys/XD.png" alt="XD" /> ', $chaine); $chaine = preg_replace('#:\)#isU', ' <img src="../images/smileys/smile.gif" alt=":)" /> ', $chaine); $chaine = preg_replace('#:\(#isU', ' <img src="../images/smileys/sad.gif" alt=":(" /> ', $chaine); $chaine = preg_replace('#:cool:#isU', ' <img src="../images/smileys/cool.gif" alt=":cool:" /> ', $chaine); $chaine = preg_replace('#:o#isU', ' <img src="../images/smileys/ohmy.gif" alt=":o" /> ', $chaine); $chaine = preg_replace('#Zz#isU', ' <img src="../images/smileys/sleep.gif" alt="Zz" /> ', $chaine); $chaine = preg_replace('#:p#isU', ' <img src="../images/smileys/tongue.gif" alt=":p" /> ', $chaine); $chaine = preg_replace('#;\)#isU', ' <img src="../images/smileys/wink.gif" alt=";)" /> ', $chaine); $chaine = preg_replace('#\^\^#isU', ' <img src="../images/smileys/happy.gif" alt="^^" /> ', $chaine); return $chaine; } //ton code de départ oui la fonction foreach existait et fonctionnait en php4 !! $query = "SELECT pseudo,comment FROM raynal_chat ORDER BY id DESC LIMIT $premier_message, $nombre_entree_par_page"; $result = mysql_query($query)or die (mysql_error()); $css = 'clair'; // Puis on fait une boucle pour afficher tous les résultats : while ($donnees = mysql_fetch_array($result) ) { foreach ($donnees as $element) { // un petit appel de la fonction $element=remplacement($element); //affichage des données echo "Element: ".$element."<br />"; } }
@lain
-
-
Salut,
meme question que ton poste 8:
$donnees.length est égal a quoi?
C'est un chiffre? -
Merci beaucoup pour ta réponse mais sa ne marche pas.
J'ai peut-être oublié quelque chose alors voila le code dans son intégrale.<?php //Pagination des pages include ('../includes/pagination.php'); $query = "SELECT pseudo,comment FROM raynal_chat ORDER BY id DESC LIMIT $premier_message, $nombre_entree_par_page"; $result = mysql_query($query)or die (mysql_error()); $css = 'clair'; // Puis on fait une boucle pour afficher tous les résultats : while ($donnees = mysql_fetch_array($result) ) { if ($css == 'clair') { $css = 'fonce'; } else { $css = 'clair'; } for ($i = 0; $i <= $donnees.length - 1; $i++ ) { echo 'donnees 1 : '.$donnees[$i].'<br/>'; $element = $donnees[$i]; echo 'element 1 : '.$element.'<br/>'; include ('../includes/regex.php'); echo 'element 2 : '.$element.'<br/>'; $donnees[$i] = $element; echo 'donnees 2 : '.$donnees[$i].'<br/>'; } ?> <table width="100%" style="text-align:left;"> <tr> <td class="<?php echo $css;?>"><b><?php echo $donnees['pseudo']; ?></b> : <?php echo $donnees['comment']; ?></td> </tr> </table> <?php } ?>
J'ai mis des écho pour voir les données mais il n'y a rien qui s'affiche.
En testant, j'ai vu que $donnees.length ne fonctionne pas car j'ai remplacé par 1 (j'ai 2 donnée différente, le pseudo et le message) et les regex marchaient. avec ce code :for ($i = 0; $i <= 1; $i++ ) { $element = $donnees[$i]; include ('../includes/regex.php'); $donnees[$i] = $element; } -
On avance :p
sa marche mais seulement avec les echo :/for ($i = 0; $i <= 1; $i++ ) { $element = $donnees[$i]; echo 'element 1 :'.$element.'<br/>'; include ('../includes/regex.php'); echo 'element 2 :'.$element.'<br/>'; $donnees[$i] = $element; echo 'donnees :'.$donnees[$i].'<br/>'; }
si j'enlève les 3 echo, le script ne fonctionne plus :s
Je comprend pas du tout
EDIT : J'ai réfléchi et en fait, il y a une confusion car dans le for j'utilise la numérotation mais dans mon code pour afficher les données, c'est avec les mot clef.
Y a-t-il un moyen de revenir au mot clef, c'est quand même plus pratique que les numéros :p -
bonjour,
faire des tests, des tests et encore des tests, ya que ce moyen qui est efficace pour trouver des bugs quand aucun message n'apparait! Mets des echos un peu partout pour voir au fur et à mesure de ton programme où sont les problèmes... -
oui déso. j'ai aucun message d'erreur mais toutes mes données s'affiche correctement.
-
Tu dis : ca ne fonctionne pas.
Tu obtiens quoi ? une erreur ? rien qui s'affiche ?
Ca pourrait donner une piste ;-) -
Non aucun message d'erreur.
voila le code (l'autre version :p)for ($i = 0; $i <= 1; $i++ ) { $element = $donnees['$i']; include ('../includes/regex.php'); $donnees['$i'] = $element; }
mais ce code ne fonctionne pas.
voici le regex mais j'ai essayé avec ce qui suit et tout marche donc ce n'est pas ma page de regex. (enfin, je pense :p)$element = $donnees['comment']; include ('../includes/regex.php'); $donnees['comment'] = $element;
ma page regex :$element = preg_replace('#\[b\](.+)\[/b\]#isU', '<strong>$1</strong>', $element);//gras $element = preg_replace('#\[i\](.+)\[/i\]#isU', '<em>$1</em>', $element);//italique $element = preg_replace('#\[u\](.+)\[/u\]#isU', '<u>$1</u>', $element);//souligné $element = preg_replace('#\[q\](.+)\[/q\]#isU', '<q>$1</q>', $element);//citation $element = preg_replace('#\[center\](.+)\[/center\]#isU', '<div style="text-align:center">$1</div>', $element);//centré $element = preg_replace('#\[color=(red|green|blue|yellow|purple|olive)\](.+)\[/color\]#isU', '<span style="color:$1">$2</span>', $element);//couleur $element = preg_replace('#\[url=http://(.+)\](.+)\[/url\]+#isU', '<a href="http://$1">$2</a>', $element);//lien $element = preg_replace('#\[url\]http://(.+)\[/url\]+#isU', '<a href="http://$1">$1</a>', $element);//lien $element = preg_replace('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#isU', '<a href="mailto:$0">$0</a>', $element);//mail $element = preg_replace('#\[img\](.+)\[/img\]#isU', '<img src="$1" alt="$1" />', $element);//image //regex des smileys $element = preg_replace('#:D#isU', ' <img src="../images/smileys/biggrin.gif" alt=":D" /> ', $element); $element = preg_replace('#XD#isU', ' <img src="../images/smileys/XD.png" alt="XD" /> ', $element); $element = preg_replace('#:\)#isU', ' <img src="../images/smileys/smile.gif" alt=":)" /> ', $element); $element = preg_replace('#:\(#isU', ' <img src="../images/smileys/sad.gif" alt=":(" /> ', $element); $element = preg_replace('#:cool:#isU', ' <img src="../images/smileys/cool.gif" alt=":cool:" /> ', $element); $element = preg_replace('#:o#isU', ' <img src="../images/smileys/ohmy.gif" alt=":o" /> ', $element); $element = preg_replace('#Zz#isU', ' <img src="../images/smileys/sleep.gif" alt="Zz" /> ', $element); $element = preg_replace('#:p#isU', ' <img src="../images/smileys/tongue.gif" alt=":p" /> ', $element); $element = preg_replace('#;\)#isU', ' <img src="../images/smileys/wink.gif" alt=";)" /> ', $element); $element = preg_replace('#\^\^#isU', ' <img src="../images/smileys/happy.gif" alt="^^" /> ', $element);
ps : commentsamarche.com transforme les [ et ] donc le code est un peu moins visibles :s -
bonsoir,
tu obtiens une erreur ?
On peux avoir un aperçu du fichier regex.php ?
- 1
- 2
Suivant